Удаляет ли Git пустые папки?

Удаляет ли Git пустые папки?

Я удалил все файлы из каталога в своей рабочей папке, но сам каталог все еще существует. После отправки изменений в удаленный репозиторий (GitHub) Я проверил свой проект и заметил, что каталог исчез. Возможно ли, что Git удаляет пустые папки?

решение1

Почему каталог не отображается?

Git не отслеживает каталоги; он отслеживает только файлы.

Если в каталоге нет файлов, этот каталог не «существует» в Git при добавлении или удалении файлов. В частности, каталог исчезнет из индекса Git, если вы удалите из него все файлы и добавите это изменение в индекс. И наоборот, каталог не будет добавлен через , git addесли он пустой.

Другими словами: если вы видите каталог локально в своем файловом браузере, но он исчез из GitHub, скорее всего, вы удалили все файлы из каталога, добавили это изменение в индекс, зафиксировали и отправили его.

Как же мне тогда отслеживать пустой каталог?

Если вы хотите явно отслеживать пустой каталог, вам нужно создать в нем файл. Поскольку Git не будет отслеживать пустые каталоги, вам нужно заставить его сделать это, добавив файл в каталоге в индекс Git.

Обычно люди хранят файл, который называется .gitkeepв каталоге, который они хотят отслеживать, но где каталог должен оставаться пустым в настоящее время. Вы можете дать файлулюбойдругое имя, конечно, но имя .gitkeepявляется соглашением. .gitkeepФайл (из-за того, что начинается с .) не будет показан в списках файлов в большинстве систем.

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

Пример

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

Здесь fooкаталог добавляется в индекс только после того, как в нем появляется файл.

Что если яДействительнохотите отслеживать пустой каталог?

При всем при этом, в принципе, базовая структура данных позволяет Git хранить пустой каталог, поскольку он будет представлен пустым «деревом». Дополнительное чтениездесьиздесь.

решение2

Добавьте следующий .gitignoreфайл в папки, которые вы хотите включить в свой репозиторий.

# Ignore everything in this directory
*
# Except this file
!.gitignore

Добавление .gitkeepработает, но не является официальным решением. Смотретьhttps://stackoverflow.com/questions/7229885/какие-различия-между-gitignore-и-gitkeep

решение3

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

Как упоминает @TRiG в комментариях, если каталог пуст на момент коммита, он не будет отображаться, например, в GitHub, поскольку git не отслеживает каталоги (он отслеживает файлы) — дерево, в котором находились эти файлы, больше не актуально, поскольку файлов нет, а значит, и дерева нет.

Без более подробной информации нам практически невозможно правильно ответить на ваши основные вопросы (что случилось?).

решение4

Для Linux / MAC OSX используйте следующую однострочную команду для создания / помещения пустых файлов-заполнителей в папки рекурсивно, чтобы предотвратить их игнорирование git:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;

Надеюсь, это кому-то поможет.

Связанный контент