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

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

Я опубликовал следующее:

git remote update
git checkout HEAD
git pull origin HEAD

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

Два вопроса:

  • Почему он не удаляет каталоги?
  • Есть ли команда git, которую я могу выполнить в текущем состоянии, чтобы удалить их?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

У меня была та же проблема, в моем случае с сервисом сборки (CI).. поскольку GIT извлекает все файлы без очистки папок, все bin/obj, которые ранее были собраны CI, являются грязными, поэтому, если я удаляю тестовый проект, bin будет по-прежнему содержать DLL и будет упоминать о несуществующих тестах.

Для того, чтобы решить эту проблему; эта команда, кажется, добивается цели (по крайней мере, для меня)

git clean -fd -x

где X удалит все неотслеживаемые файлы:

-X Удалить только файлы, игнорируемые Git. Это может быть полезно для восстановления всего с нуля, но сохраняйте созданные вручную файлы.

Ответ 5

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

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

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

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

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