Почему git clean -xfd иногда удаляет отслеживаемые файлы? Как мы можем это исправить? - PullRequest
0 голосов
/ 29 августа 2018

Время от времени git clean -xfd не только удаляет неотслеживаемые файлы и каталоги, но также удаляет отслеживаемые файлы. После очистки я могу восстановить эти отслеженные файлы с помощью git reset --hard head. Таким образом, мой поток имеет тенденцию быть:

git clean -xfd

git status               // check whether git deleted tracked files or not
git reset --hard head    // if git deleted tracked files restore them

Я подозреваю, что это чрезмерное усердие может быть связано с переименованием файла или каталога в предыдущем коммите, и что очистка затем удалила этот переименованный элемент. Это только предположение.

Это известная проблема? Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Это может происходить в Windows при использовании соединений каталога. Смотри также https://github.com/git-for-windows/git/issues/607.

git init
mkdir tracked
echo content >tracked/file
git add tracked
git commit -m initial
cmd //c mklink //j link tracked
git clean -qdfx

git clean в конце удалит tracked/file.

Менеджер пакетов NPM Node.js использует соединения каталогов при установке локальных пакетов. Конкретно, npm install file:path/to/package создаст соединение каталога в node_modules/package. Следовательно, можно столкнуться с этой проблемой при использовании Node.js.

Единственный известный мне обходной путь - не использовать соединения внутри рабочих дерев Git.

0 голосов
/ 16 сентября 2018

С той же проблемой здесь. Упрощенная структура хранилища выглядит следующим образом:

repository
|
|--dir1
|  |
|  |--junc_dir2
|
|--dir2
|  |
|  |--file
|
|--.gitignore

В корне репо папки dir1 и dir2 и один файл .gitignore со следующим содержимым

dir1 # ignore dir1

Папка dir1 содержит NTFS-переход к dir2. Папка dir2 содержит файл.

Папка dir1 игнорируется и не отслеживается. Папка dir2 и ее дочерний файл отслеживаются.

Вы называете git clean. Он будет рекурсивно просматривать содержимое папки dir1 и удалять их. Это означает, что он пройдет через соединение в dir2 и удалит там один ( tracked ) файл. После этого он удалит перекресток dir2 и папку dir1. У вас останется только пустая папка dir2 и файл .gitignore.

Произошло со мной в контексте проекта node.js, который содержал несколько пакетов, ссылающихся на себя локально (используя npm i ../path/to/package). Смотри https://github.com/npm/npm/issues/19091

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...