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

84

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

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

git remote update
git checkout HEAD
git pull origin HEAD

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

Два вопроса:

  1. Почему не удалил каталоги?
  2. Есть ли команда git, которую я могу выполнить в текущем состоянии, чтобы удалить их?
mculp
источник
Согласен, git checkout HEAD ничего не делает, так как HEAD - это ссылка на текущий извлеченный коммит. Вы, вероятно, собирались стать мастером в обоих случаях.
Cascabel,
Ну, HEAD фактически обновил все, за исключением удаления пустых каталогов. Как я уже сказал, я новичок в git.
mculp
Возможный дубликат Как заставить команду «git pull» перезаписать локальные файлы? Пожалуйста, проверьте ответы там, если вам по-прежнему нужны другие решения.
DrBeco

Ответы:

153

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

мипади
источник
4
Я не совсем понимаю. Тогда почему каталоги были удалены из моего репозитория GitHub, когда я зафиксировал / отправил изменения?
mculp
1
Каталоги в вашей рабочей копии могли содержать неотслеживаемые файлы (включая скрытые неотслеживаемые файлы), и поэтому они могут казаться пустыми, но на самом деле это не так, поэтому Git не удалил их. git cleanбудет, конечно.
mipadi
4
Это может иметь какое-то отношение к тому факту, что репозитории GitHub - это голые репозитории (у них нет рабочих копий), а у вашего локального есть. Я полагаю, если бы вы клонировали новое репо из источника GitHub, у вас не было бы этих каталогов.
mipadi
18
Но, конечно, запустите команду с -n(пробный запуск) вместо -fпервого, чтобы вы могли видеть, что будет удалено. Тем более, что git clean -dудаляет не только эти беспокоящие каталоги, но и неотслеживаемые файлы.
Тодд Оуэн,
2
@EliGolin: git cleanне удаляет файлы, перечисленные в .gitignore, если вы не передадите эту -xопцию.
mipadi
4

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

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

CB Bailey
источник
В моем репозитории GitHub нет каталогов. Когда я совершил фиксацию, он правильно удалил каталоги. Однако, когда я проверяю / тяну, он удаляет только файлы. Каталоги пусты. $ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 23 сен, 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30 сен 10:51 ../
mculp
1
Я не совсем уверен, что вы имеете в виду под «переключил ГОЛОВУ на мастера», я полагаю, вы имеете в виду « git checkout master», но большинство людей просто скажет «Я переключился на / проверил мастер». Во всяком случае, когда git сказал: «Уже актуально». это означает, что он ничего не сделал. git удалит только те каталоги, которые он делает пустыми.
CB Bailey,
Плохая формулировка. Я изменил "HEAD" на "master", как предлагали некоторые люди в комментариях.
mculp
@CharlesBailey, я не вижу того, что вы сказали. git checkoutне удалял полностью пустой каталог.
Acumenus
@ABB: Git удаляет только каталоги, сделанные пустой операцией проверки. Я проверил это снова; он все еще работает.
CB Bailey,
3

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

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

git clean -fd -x

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

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

Йогурту
источник
2

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

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

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

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

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

qwertzguy
источник
-1

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

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

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

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

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

Янко
источник
1
На вики-странице сказано, что git не создает для вас пустые каталоги. Он не говорит, что не удалит пустые каталоги. То, что хочет mculp, у меня работает.
innaM
@janko, Собственно, git мне не удалось удалить полностью пустой каталог.
Acumenus