использование каталога NUL в Windows испортило мой Git

У меня некоторое время работал этот код в кодовой базе Node.js:

if (os.platform() === 'win32') {
    stdout = fs.openSync('NUL', 'a');

он поместил файл-призрак («NUL») на мою машину в корень проекта, и я не могу его git rm или удалить навсегда. Наличие этого файла делает git очень ненадежным; коммиты, кажется, не работают полностью.

Кто-нибудь знает, что с этим делать?


person Alexander Mills    schedule 10.02.2016    source источник
comment
comment
Возможный дубликат Удалить файл с именем NUL в Windows   -  person Dietrich Epp    schedule 10.02.2016


Ответы (1)


Хорошая новость: это больше не испортит ваш Git.
Потому что с Git 2.25 (1 квартал 2020 г.) Git запрещает имена путей, которые файловая система платформы не может представить на MinGW.

См. commit 4dc42c6, коммит 98d9b23 (21 декабря 2019 г.), автор Йоханнес Шинделин (dscho).
(Объединено Юнио С. Хамано -- gitster -- в commit 13432fc, 2 января 2020 г.)

mingw: отклонять пути, содержащие зарезервированные имена.

Подписал: Йоханнес Шинделин

Есть несколько зарезервированных имен, которые не могут быть именами файлов в Windows, например AUX, NUL и т. д.
Почти полный список см. в разделе "Именование файлов, путей и пространств имен: 'Соглашения об именах'".

Если бы кто-то попытался создать каталог с именем NUL, он фактически «успех», то есть вызов вернул бы успех, но ничего не было бы создано.

Хуже того, даже добавление расширения файла к зарезервированному имени не делает его действительным именем файла.
Чтобы понять причину такого поведения, см. "Что делать с такими зарезервированными именами файлов, как NUL и CON?" из Раймонд Чен.

Давайте просто запретим их все.


Git 2.27 (второй квартал 2020 г.) исправляет еще одну проблему с COM0.

См. коммит 3efc128 (09 апреля 2020 г.) и commit b6852e1 (08 апреля 2020 г.), автор Йоханнес Шинделин (dscho).
См. commit a748f3f (8 апреля 2020 г.), автор Маттиас Ашхауэр (rimrul).
(объединено < a href="https://github.com/gitster" rel="nofollow noreferrer">Юнио С. Хамано -- gitster -- в commit b3eb70e, 22 апреля 2020 г.)

mingw: не рассматривать COM0 как зарезервированное имя файла.

Подписал: Йоханнес Шинделин

В 4dc42c6c186 ("mingw: отказаться от путей, содержащих зарезервированные имена", 2019-12-21 , Git v2.25.0-rc1 -- слияние), мы начали запрещать имена файлов, зарезервированы, например NUL, CONOUT$ и т. д.

Это включало COM<n>, где <n> — цифра.

К сожалению, сюда входит COM0, но зарезервированы только COM1, ..., COM9, согласно официальной документации, COM0 упоминается в разделе "Пространства имен NT", но явно опущено из списка зарезервированных имена: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions

Тесты подтверждают это: вполне возможно записать файл с именем com0.c в Windows 10, но не com1.c.

Итак, давайте ужесточим код, чтобы запретить только зарезервированные имена файлов COM<n>, но снова разрешить COM0.

Это устраняет git-for-windows/git проблему 2470 "Невозможно добавить файл COM0.c или ветку проверки, содержащую COM0.c файл".

person VonC    schedule 03.01.2020