Как я могу добавить пустой каталог в Git-репозиторий? - PullRequest
3815 голосов
/ 22 сентября 2008

Как добавить пустой каталог (без файлов) в репозиторий Git?

Ответы [ 28 ]

3716 голосов
/ 01 июня 2009

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

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

Тогда вам не нужно правильно оформлять заказ, как в решении m104 .

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

Сохранение комментария @ GreenAsJade :

Я думаю, что стоит отметить, что это решение делает именно то, о чем спрашивал вопрос, но, возможно, не то, что искали многие люди, смотрящие на этот вопрос. Это решение гарантирует, что каталог остается пустым. Он говорит: «Я действительно никогда не хочу, чтобы файлы проверялись здесь». В отличие от «У меня пока нет файлов для проверки, но мне нужен каталог здесь, файлы могут появиться позже».

1031 голосов
/ 22 сентября 2008

Вы не можете. См. Git FAQ .

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

Каталоги добавляются автоматически при добавлении файлов внутри них. Тот каталоги не нужно добавлять в хранилище, и не отслеживаются самостоятельно.

Вы можете сказать "git add <dir>", и это добавит туда файлы.

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

651 голосов
/ 07 декабря 2011

Создайте в каталоге пустой файл с именем .gitkeep и добавьте его.

396 голосов
/ 15 марта 2011

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

298 голосов
/ 29 января 2014
touch .keep

В Linux создается пустой файл с именем .keep. Это имя предпочтительнее, чем .gitkeep, так как первое не зависит от Git, тогда как второе относится к Git. Во-вторых, как заметил другой пользователь, соглашение о префиксе .git должно быть зарезервировано для файлов и каталогов, которые использует сам Git.

В качестве альтернативы, как отмечено в другом ответе , каталог может содержать описательный README или README.md файл .

Конечно, это требует, чтобы присутствие файла не приводило к разрыву приложения.

260 голосов
/ 05 декабря 2013

Зачем нам нужны пустые версионные папки

Перво-наперво:

Пустой каталог не может быть частью дерева в системе управления версиями Git .

Это просто не будет отслеживаться. Но есть сценарии, в которых «управление версиями» пустых каталогов может иметь смысл, например:

  • поддерживает предопределенную структуру папок 1015 *, делая ее доступной для каждого пользователя / участника репозитория; или, как особый случай вышеупомянутого, создание папки для временных файлов , таких как каталоги cache/ или logs/, где мы хотим предоставить папку, но .gitignore ее содержимое
  • в связи с вышеизложенным, некоторые проекты не будут работать без каких-либо папок (что часто является намеком на плохо спроектированный проект, но это частый сценарий реального мира и, возможно, может быть, скажем , проблемы с разрешениями, которые необходимо решить).

Некоторые предлагаемые обходные пути

Многие пользователи предлагают:

  1. Размещение файла README или другого файла с некоторым содержимым, чтобы сделать каталог не пустым, или
  2. Создание файла .gitignore с некой «обратной логикой» (т. Е. Для включения всех файлов), которая, в конце концов, служит той же цели, что и подход № 1.

Хотя оба решения наверняка работают Я считаю, что они несовместимы с осмысленным подходом к Git-версиям.

  • Почему вы должны поместить поддельные файлы или файлы README, которые, возможно, вам не нужны в вашем проекте?
  • Зачем использовать .gitignore, чтобы делать что-то ( сохраняя файлов), прямо противоположное тому, для чего оно предназначено ( исключая файлы), даже если это возможно?

.Gitkeep подход

Используйте пустой файл с именем .gitkeep для принудительного присутствия папки в системе управления версиями.

Хотя это может показаться не такой большой разницей:

  • Вы используете файл, цель которого single - сохранить папку. Вы не помещаете туда информацию, которую не хотите помещать.

    Например, вы должны использовать README в качестве README с полезной информацией, а не в качестве предлога для сохранения папки.

    Разделение проблем - это всегда хорошо, и вы все равно можете добавить .gitignore, чтобы игнорировать ненужные файлы.

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

    • Файл, не связанный с кодом (из-за начальной точки и имени)
    • Файл, явно связанный с Git
    • Его цель ( keep ) четко сформулирована, последовательна и семантически противоположна по смыслу игнорировать

Принятие

Я видел подход .gitkeep, принятый очень важными средами, такими как Laravel , Angular-CLI .

122 голосов
/ 03 мая 2011

Как описано в других ответах, Git не может представлять пустые каталоги в своей промежуточной области. (См. Git FAQ .) Однако, если для ваших целей каталог достаточно пуст, если он содержит только файл .gitignore, вы можете создавать .gitignore файлы в пустых каталогах только через

find . -type d -empty -exec touch {}/.gitignore \;
61 голосов
/ 22 сентября 2008

Энди Лестер прав, но если ваш каталог просто должен быть пустым, а не empty empty, вы можете поместить туда пустой файл .gitignore в качестве обходного пути.

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

30 голосов
/ 22 октября 2012

Способ создания папки журнала Ruby on Rails :

mkdir log && touch log/.gitkeep && git add log/.gitkeep

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

Лог-файлы можно сохранить, выдав,

echo log/dev.log >> .gitignore

но вы, вероятно, знали это.

27 голосов
/ 06 мая 2011

Git не отслеживает пустые каталоги. См. Git FAQ для более подробного объяснения. Предложенный обходной путь - поместить файл .gitignore в пустой каталог. Мне не нравится это решение, потому что .gitignore является "скрытым" соглашением Unix. Также нет объяснения, почему каталоги пусты.

Я предлагаю поместить файл README в пустой каталог, объясняя, почему каталог пуст и почему его нужно отслеживать в Git. С файлом README, что касается Git, каталог больше не является пустым.

Реальный вопрос - зачем вам пустой каталог в git? Обычно у вас есть какой-то сценарий сборки, который может создать пустой каталог перед компиляцией / запуском. Если нет, то сделайте один. Это гораздо лучшее решение, чем помещать пустые каталоги в git.

Итак, у вас есть причина, по которой вам нужен пустой каталог в git. Укажите эту причину в файле README. Таким образом, другие разработчики (и вы в будущем) знаете, почему там должен быть пустой каталог. Вы также будете знать, что вы можете удалить пустой каталог, когда проблема, требующая пустого каталога, была решена.


Чтобы вывести список всех пустых каталогов, используйте следующую команду:

find -name .git -prune -o -type d -empty -print

Чтобы создать заполнители README в каждом пустом каталоге:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Чтобы игнорировать все в каталоге, кроме файла README, вставьте следующие строки в .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Кроме того, вы можете просто исключить каждый файл README из игнорируемого:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Чтобы вывести список всех файлов README после того, как они уже созданы:

find -name README.emptydir
...