Каковы различия между .gitignore и .gitkeep?

1927

Каковы различия между .gitignoreи .gitkeep? Это одно и то же с другим именем или они выполняют разные функции?

Кажется, я не могу найти много документации по .gitkeep.

Мэтти
источник

Ответы:

3444

.gitkeep не задокументировано, потому что это не особенность Git.

Git не может добавить полностью пустой каталог . Люди, которые хотят отслеживать пустые каталоги в Git, создали соглашение о размещении файлов, называемых .gitkeepв этих каталогах. Файл может называться как угодно; Git не придает особого значения этому имени.

Существует конкурирующее соглашение о добавлении .gitignoreфайла в пустые каталоги для отслеживания их, но некоторые люди считают, что это сбивает с толку, поскольку цель состоит в том, чтобы сохранить пустые каталоги, а не игнорировать их; .gitignoreтакже используется для отображения файлов, которые Git должен игнорировать при поиске неотслеживаемых файлов.

Wooble
источник
414
Разве не было бы лучшим решением поместить READMEфайл в другой пустой подкаталог, содержащий немного информации о том, для чего будет использоваться этот подкаталог? Кажется странным иметь файл с именем, .gitkeepкоторый на самом деле не является частью git.
тамуза
423
@tamouse много раз, путь к пустому каталогу (например, имена папок) достаточен для выражения его цели (примеры: шаблоны / кэш, загрузка / превью и т. д.). В этих случаях размещение readme в каждом из них кажется излишним.
Халил Озгюр
16
люди, которые хотят отслеживать пустые каталоги, должны указывать в README, что каталог должен быть создан, или создавать каталоги с помощью своего инструмента сборки или любых других инструментов, для которых требуется каталог; /
32
@tamouse, @omouse: .gitignoreфайл с двумя линиями: *и !.gitignoreболее чем достаточно ясности , чтобы передать то , что происходит. Если требуется дополнительная проработка, добавьте комментарий в начало файла, используя # синтаксис.
Дрооганс
63
Стоит отметить, что популярная платформа Rails немного изменила это соглашение, используя .keepфайлы вместо того, .gitkeepчтобы сохранять эти пустые папки, поскольку git не единственная система контроля версий, которая не отслеживает пустые папки. Больше подробностей здесь: github.com/rails/rails/issues/2800
Клаудио Флореани
330

.gitkeepэто просто заполнитель. Файл-пустышка, поэтому Git не забудет про каталог, так как Git отслеживает только файлы.


Если вам нужен пустой каталог и убедитесь, что он остается «чистым» для Git, создайте .gitignoreв нем следующие строки:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

Если вы хотите, чтобы в Git был виден только один тип файлов, вот пример того, как отфильтровать все, кроме .gitignore и всех .txtфайлов:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

(«#» обозначает комментарии.)

sjas
источник
3
Мне нравится эта практика сама. Если бы в этих каталогах был исходный код, не было бы необходимости в .gitkeep, и в общем случае это временный / кэш / пользовательский контент, который во время тестирования будет сгенерирован в любом случае, поэтому вам придется также .gitignore эти файлы
chrisan
1
Зачем вам нужно !перед .gitignore? Это для того, чтобы избежать точки?
Будет
7
@Will - Нет, !отрицает следующую часть, как это обычно бывает в программировании.
Sjas
3
Нет необходимости помещать !.gitignoreфайл git ignore, либо добавьте файл, затем отредактируйте его, либо принудительно добавьте его с соответствующим содержимым («*», чтобы игнорировать все, или ничего, чтобы просто убедиться, что папка существует), следующий пример .
AD7six
13
По вашей ссылке: Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------ Если это не так, и вы не делаете принудительное добавление, вы можете забыть об этом. В тривиальных случаях нет проблем, но если это файл большего размера, вы можете быть расстроены. Использование !.gitignoreмешает вам выстрелить себе в ногу. Я предпочитаю это, сжег себя в прошлом.
Sjas
125
.gitignore

текстовый файл, содержащий список файлов в вашем каталоге, которые git будет игнорировать или не добавлять / обновлять в хранилище.

.gitkeep

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

Просто touch /path/to/emptydirectory/.gitkeepдобавьте файл, и Git теперь сможет поддерживать этот каталог в репозитории.

Джим Мунро
источник
18
Вы можете иметь столько .gitignores, сколько хотите, если не хотите каждый раз указывать полный путь к каждой папке.
sjas
1
Я пытаюсь упомянуть пустой список каталогов в .gitkeepфайле, но он не будет отслеживать пустые каталоги, только папку отслеживать, где .gitkeepфайл существует. почему так ?
Пардип Джейн
2
.gitkeep не работает как .gitignore. Это не список каталогов для хранения. Это просто пустой файл, который находится в каталоге, который вы хотите сохранить. Он может называться как угодно .keep и т. Д. Таким образом, у вас может быть каталог, например / foo / bar, и файл gitkeep будет /foo/bar/.gitkeep
Джим Манро,
@sjas как бы несколько .gitignores избавили вас от необходимости указывать полный путь к каждой папке каждый раз? Я думаю, что упускаю что-то очевидное.
Willwsharp