Git checkout / pull не удаляет каталоги?


У меня есть РЕПО @ github. Я немного поработал дома и подтолкнул его к github. Это включало некоторое удаление файлов и каталогов. Теперь я нахожусь на своем рабочем ящике, в котором была копия кода перед удалением файлов и каталогов.

Я выдал следующее:

git remote update
git checkout HEAD
git pull origin HEAD

он удалил все файлы, которые он должен был иметь, но не каталоги, в которых были файлы.

два вопроса:

  1. почему он не удалил каталоги?
  2. есть ли команда git, которую я могу выдать в текущем состоянии, чтобы удалить их?
4 68

4 ответа:

Git не отслеживает каталоги, поэтому он не будет удалять те, которые становятся пустыми в результате слияния или других изменений. Тем не менее, вы можете использовать git clean -fd для удаления неотслеженных каталогов (the -fd флаг означает f orce удаление неотслеженных файлов и directories).

как часть большинства операций, которые изменяют рабочее дерево (pull, merge, checkout и т. д.) git удалит все каталоги, которые были опустошены этой операцией (т. е. git удалил последний файл).

git не будет удалять любые каталоги, которые не являются полностью пустыми, так что если Вы скрыли или проигнорировали файлы, то только потому, что git удаляет последний гусеничная файл из этого каталога не обязательно означает, что git сможет удалить этот каталог. ГИТ не делает считайте это условием ошибки, поэтому не жалуйтесь на это.

Git не отслеживает каталоги, файлы (с их пути). Git создает все каталоги для этих путей, если они еще не существует (круто!), однако это делает не удалить их, если все файлы, содержащиеся в пути перемещаются или удаляются (не круто ☹ ... но на то есть причины).

решение (после того, как вы вытащили / перемотка вперед / слияние):

git stash --include-untracked
git clean -fd
git stash pop

если вы этого не сделаете stash до clean, вы потеряете все ваши неотслеживаемый файлы (безвозвратно.)

Примечание: поскольку это также очищает все игнорируемые файлы, вам может потребоваться снова запустить некоторые из ваших сценариев сборки для воссоздания метаданных проекта (например:./gradlew eclipse). Это также удаляет пустые каталоги, которые никогда не были частью путей файлов git.

Git в настоящее время не отслеживает каталоги (см. git wiki),то есть вы не можете добавлять пустые каталоги и не будете удалять каталоги, которые в конечном итоге пусты.(EDIT: спасибо, Мэнни, я ошибся! Ты не можешь добавить пустые каталоги, но git будет удалить каталоги, которые становятся пустыми, потому что их отслеживаемое содержимое было удалено.)

что касается команды для удаления пустых каталогов: что зависит от вашей операционной системы.

для Linux вы можете использовать, например,

find -depth -type d -empty -exec rmdir {} \;

однако это приведет к удалению все пустые каталоги!