
Я удалил все файлы из каталога в своей рабочей папке, но сам каталог все еще существует. После отправки изменений в удаленный репозиторий (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 \;
Надеюсь, это кому-то поможет.