Git checkout/pull не удаляет каталоги?
У меня есть репо @ github. Я немного поработал дома и отправил на github. Это привело к удалению некоторых файлов и каталогов. Теперь я нахожусь в своем рабочем ящике, в котором была копия кода перед удалением файлов и каталогов.
Я выдал следующее:
git remote update
git checkout HEAD
git pull origin HEAD
Он удалил все файлы, которые он должен иметь, но не каталоги, в которых они были.
Два вопроса:
- Почему это не удалить каталоги?
- Есть ли команда git, которую я могу выдать в текущем состоянии, чтобы удалить их?
6 ответов
Git не отслеживает каталоги, поэтому он не удаляет те, которые становятся пустыми в результате слияния или других изменений. Тем не менее, вы можете использовать git clean -fd
удалить неотслеживаемые каталоги (-fd
флаг означает удаление файлов и каталогов без отслеживания).
У меня была такая же проблема, в моем случае на службе сборки (CI). Поскольку GIT извлекает все файлы без очистки папок, все bin / obj, которые были ранее созданы CI, грязны, поэтому, если я удалю тестовый проект, bin по-прежнему будет содержать DLL и упоминать несуществующие тесты.
Чтобы решить эту проблему; эта команда, кажется, помогает (по крайней мере, для меня)
git clean -fd -x
где X удалит все неотслеживаемые файлы:
-X Удалить только файлы, игнорируемые Git. Это может быть полезно для восстановления всего с нуля, но сохранить файлы, созданные вручную.
Как часть большинства операций, которые изменяют рабочее дерево (извлечение, объединение, извлечение и т. Д.), Git удалит все каталоги, которые были освобождены этой операцией (т.е. git удалил последний файл).
git не удалит все каталоги, которые не являются полностью пустыми, поэтому, если вы скрыли или проигнорировали файлы, то только то, что git удаляет последний отслеживаемый файл из этого каталога, не обязательно означает, что git сможет удалить этот каталог. git не считает это ошибочным условием, поэтому не будет жаловаться на это.
Git не отслеживает каталоги, файлы (с их путями). Git создает все каталоги для этих путей, если они еще не существуют (круто!), Но не удаляет их, если все файлы, содержащиеся в пути, перемещены или удалены (не круто ☹ ... но есть причины).
Решение (как только вы вытянули / перешли вперед / объединились):
git stash --include-untracked
git clean -fd
git stash pop
Если вы этого не сделаете stash
до clean
, вы потеряете все ваши неотслеживаемые файлы (необратимо).
Примечание: поскольку при этом также удаляются все игнорируемые файлы, вам может потребоваться снова запустить некоторые из ваших сценариев сборки, чтобы воссоздать метаданные проекта (например: ./gradlew eclipse
). Это также приводит к удалению пустых каталогов, которые никогда не были частью путей к файлам git.
Для меня каталог был подмодулем, поэтому мне нужно было запустить-f
дважды:
git clean -f -f -d
Git в настоящее время не отслеживает каталоги (см. Git wiki), то есть вы не можете ни добавлять пустые каталоги, ни удалять git каталоги, которые в итоге оказываются пустыми. (РЕДАКТИРОВАТЬ: Спасибо, Манни, я ошибся! Вы не можете добавить пустые каталоги, но git удалит каталоги, которые стали пустыми, потому что их отслеживаемый контент был удален.)
Что касается команды для удаления пустых каталогов: это зависит от вашей операционной системы.
Для Linux вы можете использовать, например,
find -depth -type d -empty -exec rmdir {} \;
Тем не менее, это удалит все пустые каталоги!