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

3652

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

  • 12
    Хотя это бесполезно, есть способ взломать пустой (действительно пустой) каталог в вашем репо . Однако он не будет checkout с текущими версиями Git.
  • 290
    @ два Я, например, не согласен, что это бесполезно. Ваша иерархия каталогов является частью вашего проекта, поэтому она должна контролироваться версией.
Показать ещё 14 комментариев
Теги:
directory
git-add

33 ответа

3565
Лучший ответ

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

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

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

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

Сделать комментарий @GreenAsJade постоянным:

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

  • 19
    Я думаю, что решение README, предложенное @JohnMee, должно использоваться вместе с этим; файл .gitignore содержит объяснение того, что мы хотим не допускать в управлении версиями, в то время как файл README объясняет назначение каталога, которые являются очень важной частью информации.
  • 14
    @pedromanoel Я пишу документацию, которую вы поместили бы в README внутри файла .gitignore (в качестве комментариев).
Показать ещё 20 комментариев
954

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

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

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

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

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

  • 61
    Ниже ответ НАМНОГО лучше. Тот факт, что git низкоуровневого программного обеспечения не позволяет, для меня не так важно, как на самом деле использовать Git, когда мне нужен пустой каталог. Добавление 2 строки .gitignore кажется приемлемым для меня.
  • 1
    Хорошо, если кто-то хочет переместить файлы в новый каталог, он не может сделать это через git mv как git будет жаловаться, что новый каталог не находится под контролем версий
Показать ещё 7 комментариев
657

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

  • 49
    Я добавил ответ, поощряющий создание .keep вместо этого.
  • 169
    .gitkeep не был предписан Git и заставит людей вторично угадать его значение, что приведет их к поискам в Google, которые приведут их сюда. Соглашение с префиксом .git должно быть зарезервировано для файлов и каталогов, которые использует сам Git.
Показать ещё 7 комментариев
367

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

  • 36
    +1, Хорошее предложение, пустой каталог не имеет никакого смысла, если он не будет использоваться в будущем. Поэтому создайте файл README внутри него и напишите, для чего этот каталог, и какие файлы будут помещены туда в будущем. Это решает обе проблемы.
  • 2
    Согласен. Пустые папки раздражают и должны быть объяснены во всех должным образом обработанных репозиториях любого вида.
Показать ещё 13 комментариев
266
touch .keep

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

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

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

  • 1
    Это хорошо для начальной пустой директории, но что, если она начнет заполняться файлами? Тогда Git заметит их и потребует их как неотслеживаемые файлы. Выбранный ответ здесь работает гораздо более элегантно, позволяя хранить каталог, но затем безопасно игнорировать его содержимое.
  • 11
    Вопрос и основная общая проблема заключается в добавлении пустого каталога. Если позже у него есть резидентный файл, очевидно, удалите файл .keep или просто проигнорируйте его. Если вместо этого файлы в каталоге нужно игнорировать, это совсем другой вопрос.
Показать ещё 7 комментариев
225

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

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

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

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

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

Некоторые предложенные обходные пути

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

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

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

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

.gitkeep подход

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

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

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

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

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

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

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

Принятие

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

  • 6
    Вы пропустили одну мысль - в чем причина хранения и пустой папки (например, / logs, / tmp, / uploads)? Да, его папка должна быть пустой. :) Так что если вы хотите оставить папку пустой, вы должны игнорировать файлы внутри нее.
  • 14
    @RomanAllenstein: не обязательно. Возможно, вы создадите репо с заданной структурой, которая может быть заполнена позже. Эти файлы будут добавлены в репозиторий, как только они будут созданы, и это будет раздражать, если вы начнете удалять или редактировать файлы .gitignore (и опасно, потому что, вероятно, вы даже не понимаете, что они не отслеживаются: git игнорирует их )
Показать ещё 8 комментариев
114

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

find . -type d -empty -exec touch {}/.gitignore \;
  • 20
    Вы можете игнорировать каталог .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
  • 2
    В большинстве случаев более простым вариантом является find * -type d -empty -exec touch {}/.gitignore \;
Показать ещё 4 комментария
56

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

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

  • 4
    Это именно то, что я сказал. Оба параграфа рассмотрены во фрагменте часто задаваемых вопросов, которые я разместил.
  • 1
    Я думаю, что это неинтересно и полезно знать - это можно исправить, просто не ожидайте этого в ближайшее время, когда в большинстве случаев есть такой простой обходной путь.
Показать ещё 3 комментария
31

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

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

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

Логфайлы могут быть сохранены путем выпуска,

echo log/dev.log >> .gitignore

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

27

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
25

ПРЕДУПРЕЖДЕНИЕ: эта настройка не работает, как оказалось. Извините за неудобства.

Оригинальное сообщение ниже:

Я нашел решение, играя с Git внутренними элементами!

  • Предположим, что вы находитесь в своем репозитории.
  • Создайте свой пустой каталог:

    $ mkdir path/to/empty-folder
    
  • Добавьте его в индекс, используя команду сантехника и пустое дерево SHA-1:

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder
    

    Введите команду и введите вторую строку. Нажмите Enter, а затем Ctrl + D, чтобы завершить ввод. Примечание: формат является типом режима [ПРОБЕЛ] [ПРОБЕЛ] SHA-1hash [TAB] (вкладка важна, форматирование ответа не сохраняет ее).

  • Что это! Ваша пустая папка указана в вашем индексе. Все, что вам нужно сделать, это зафиксировать.

Это решение короткое и, по-видимому, прекрасно работает (см. EDIT!), но его не так просто запомнить...

Пустое дерево SHA-1 можно найти, создав в него новый пустой репозиторий Git, cd и выпустив git write-tree, который выводит пустое дерево SHA-1.

EDIT:

Я использую это решение, так как нашел его. Кажется, он работает точно так же, как создание подмодуля, за исключением того, что ни один модуль не определен нигде. Это приводит к ошибкам при выпуске git submodule init|update. Проблема в том, что git update-index перезаписывает часть 040000 tree в 160000 commit.

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

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

  • 0
    git svn dcommit пустую папку в индекс и git svn dcommit можно ли выполнить git svn dcommit с желаемым результатом?
  • 2
    Вряд ли этот твик будет работать с любым другим инструментом. Как указано в предупреждении и редактировании, я не рекомендую использовать его, если только в весьма ограниченном случае.
Показать ещё 7 комментариев
21

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

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

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

ln -sf .generated/bin bin
git add bin

Если вы хотите очистить исходное дерево, вы можете просто:

rm -rf .generated ## this should be in a "clean" script or in a makefile

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

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

.generated
  • 1
    Примечание: предложенная мной символическая ссылка «неработающая» при чистой проверке, поскольку .generated каталог не существует. Он больше не будет сломан, как только вы сделаете свою сборку.
  • 1
    Я согласен, что в некоторых случаях это очень хорошая идея, но в других (например, при распространении проекта, в котором у вас есть пустой скелет с папками, такими как модели / и представления /), вы бы хотели, чтобы пользователь имел эти каталоги под рукой, а не чем читать вручную документы, и можно ожидать, что после клонирования репозитория они запустят какой-то инсталляционный скрипт. Я думаю, что этот ответ в сочетании с ответом README @ john-mee должен охватывать большинство, если не все случаи.
19

Скажем, вам нужен пустой каталог с именем tmp:

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

Другими словами, вам нужно добавить файл .gitignore в индекс, прежде чем вы сможете сказать Git игнорировать его (и все остальное в пустом каталоге).

  • 10
    Две вещи: вы можете просто "echo" * '> tmp / .gitignore "вместо касания, и" git commit -m "не фиксирует изменения, сделанные после того, как вы добавили файлы в индекс.
  • 0
    touch file; echo bla > file дает file: File exists здесь; в этом случае безопаснее всего использовать rm file; touch file; echo something >> file (и, возможно, многие другие решения ;-))
Показать ещё 4 комментария
14

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

Вот почему я решил написать инструмент с открытым исходным кодом, который может автоматически управлять созданием/удалением таких файлов-заполнителей. Он написан для платформы .NET и работает под Mono (.NET для Linux) и Windows.

Просто взгляните на: http://code.google.com/p/markemptydirs

12

Вы не можете и, к сожалению, никогда не сможете. Это решение, сделанное самим Линусом Торвальдом. Он знает, что хорошо для нас.

Там есть что-то, что я читал однажды.

Я нашел Re: Пустые директории.., но, возможно, есть еще один.

Вы должны жить с обходными решениями... к сожалению.

  • 1
    Я знаю, что вы опубликовали это как пример плохого аргумента, но я ценю ссылку, потому что это на самом деле аргументированный аргумент против отслеживания каталогов. ;-)
  • 1
    Этот ответ кажется противоречивым, поскольку в следующем посте в ссылочной теме Линус Торвальд говорит, что ожидает, что им потребуется добавить отслеживание каталогов: markmail.org/message/libip4vpvvxhyqbl . На самом деле, он говорит, что «приветствовал бы патчи, которые [добавляют поддержку для отслеживания пустых каталогов]»
Показать ещё 1 комментарий
10

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

9

Мне нравятся ответы @Artur79 и @mjs, поэтому я использовал комбинацию обоих и сделал их стандартом для наших проектов.

find . -type d -empty -exec touch {}/.gitkeep \;

Однако только несколько наших разработчиков работают на Mac или Linux. На Windows много работы, и я не смог найти эквивалентную простую однострочную версию для того же. Некоторым посчастливилось установить Cygwin по другим причинам, но назначение Cygwin только для этого казалось излишним.

Изменить для лучшего решения

Итак, поскольку у большинства наших разработчиков уже установлен Ant, первое, о чем я подумал, - собрать файл сборки Ant, чтобы выполнить это независимо от платформы. Это все еще можно найти здесь

Однако, позже я подумал, было бы лучше сделать это в небольшую команду утилиты, так что я воссоздал его с помощью Python и опубликовал его в PyPI здесь. Вы можете установить его, просто запустив:

pip3 install gitkeep2

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

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-directories in the specified path.
  -l, --let-go        Remove the .gitkeep files from the specified path.
  -e, --empty         Create empty .gitkeep files. This will ignore any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it important to push the specified
                      directory to source control even if it empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

Я надеюсь, что вы найдете это полезным.

8

Решение Jamie Flournoy отлично работает. Вот немного расширенная версия, чтобы сохранить .htaccess:

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

С помощью этого решения вы можете зафиксировать пустую папку, например /log, /tmp или /cache, и папка останется пустой.

  • 2
    Он хочет сохранить пустой каталог, а не файл.
  • 2
    И я упомянул, что он также сохранит .htaccess. Пример: если в программном обеспечении есть каталог для лог-файлов (например, oxishop), который не должен быть доступен через Интернет, в каталоге есть .htaccess. Если вы поместите вышеупомянутый .gitignore в папку, .htaccess не будет завершен, и папка будет доступна через Интернет.
Показать ещё 2 комментария
8

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

ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

Я застрял в Rakefile для легкого доступа.

  • 6
    Я бы лучше использовал find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
7

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

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

Префикс . обозначает его как скрытый файл.

Еще одна идея - добавить файл README, объясняющий, для чего будет использоваться каталог.

7

Вот хак, но забавно, что он работает (Git 2.2.1). Подобно тому, что предложил @Teka, но легче запомнить:

  • Добавить подмодуль в любой репозиторий (git submodule add path_to_repo)
  • Это добавит папку и файл .submodules. Зафиксируйте изменения.
  • Удалить .submodules файл и зафиксировать изменения.

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

fatal: Недействительное имя объекта b64338b90b4209263b50244d18278c0999867193

Я бы не рекомендовал использовать его, хотя он может перестать работать в будущих версиях Git. Это может привести к повреждению вашего хранилища.

  • 2
    Смертельный взлом.
  • 0
    Это на самом деле работает, но я думаю, что смущает IntelliJ ...: |
7

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

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

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

  • 2
    Просто так мы все на одной странице, я так больше не делаю. Это пустая трата времени. Соглашение .gitkeep - намного лучшая практика.
  • 0
    Я не понимаю, как это может быть пустой тратой времени. Когда ваш TEMPLATEPATH явно динамический, вы не можете использовать решение .gitkeep. И даже с нединамической структурой папок вы должны добавить еще кое-что вместо того, чтобы удалить очень хорошее решение проверки каталогов, например, проверить права доступа и chmod файлы. Добавление способа пометки каталогов внутри глобального .gitignore было бы для меня идеальным решением. Что-то вроде #keep / path / to / dir
4

Git не может добавить полностью пустую папку. Таким образом, вам понадобится что-то вроде .keep или .gitkeep или README или README.md или любого пользовательского именованного пустого файла.

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

git add <dir> добавит файлы в каталог.

Изображение 7468

  • <dir>/ для добавления dir.
  • ../ для перехода в родительский каталог.

Опция командной строки: touch .gitkeep

4

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

/app/data/**/*.* !/app/data/**/*.md

Затем вы можете зафиксировать описательные файлы README.md(или пустые файлы, это не имеет значения, если вы в этом случае можете настроить их однозначно как с помощью *.md), чтобы гарантировать, что все каталоги остаются часть репо, но файлы (с расширениями) игнорируются. ОГРАНИЧЕНИЕ: . недопустимы в именах каталогов!

Вы можете заполнить все эти каталоги файлами xml/images и т.д. и добавить дополнительные каталоги под /app/data/ с течением времени, которые потребуются для хранения вашего приложения (с файлами README.md, предназначенными для записи в описании что для каждого каталога хранения точно).

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

Изображение 7469

4

Иногда вам приходится иметь дело с плохими письменными библиотеками или программным обеспечением, которым нужен "настоящий" пустой и существующий каталог. Помещение простого .gitignore или .keep может привести к их повреждению и вызвать ошибку. В этих случаях может помочь следующее, но нет гарантии...

Сначала создайте необходимый каталог:

mkdir empty

Затем вы добавляете сломанную символическую ссылку в этот каталог (но в любом другом случае, чем описанный выше пример использования, используйте README с объяснением):

ln -s .this.directory empty/.keep

Чтобы игнорировать файлы в этом каталоге, вы можете добавить их в свой корень .gitignore:

echo "/empty" >> .gitignore

Чтобы добавить проигнорированный файл, используйте его параметр:

git add -f empty/.keep

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

find empty -type f

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

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

Но я настоятельно рекомендую использовать это решение только в особых обстоятельствах, хорошо написанный README в пустом каталоге, как правило, является лучшим решением. (И я не знаю, работает ли это с файловой системой Windows...)

4

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

  • 54
    Я оспариваю это мнение. Структура - это контент, и все, что вы называете, способствует содержанию.
  • 18
    Пустой файл не является ни исходным кодом, ни содержимым. Это просто имя. Тем не менее, Git с радостью отследит пустые файлы. Я не думаю, что это было намеренное дизайнерское решение заставить Git отказаться от отслеживания пустых каталогов. Я думаю, что отслеживание пустых каталогов - это функция, которая просто не нужна в 99% случаев, поэтому они не удосужились выполнить дополнительную работу, необходимую для правильной работы. Git может сделать это, если кто-то сильно хочет эту функцию для ее реализации. Я сомневаюсь, что сопровождающие Git были бы против такого исправления, если бы оно было сделано правильно.
Показать ещё 3 комментария
3

Если вы хотите добавить пустой каталог в репозиторий Git, вы можете сделать одно. Создайте файл с именем .gitignore, а затем запишите его внутри него:

/directory/*
!.gitignore

Первая строка сообщает Git игнорировать все в этом каталоге. Вторая строка сообщает Git не игнорировать файл .gitignore.

3

Добавление еще одной опции в сражение.

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

Формат, как уже упоминалось, следующий:

*
!.gitignore

Теперь, если вам нужен способ сделать это в командной строке одним махом, в то время как внутри каталога, который вы хотите добавить, вы можете выполнить:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

Я сам, у меня есть оболочка script, которую я использую для этого. Назовите script все, что вы хотите, и добавьте его где-нибудь в свой путь включения или обратитесь к нему напрямую:

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore

С помощью этого вы можете выполнить его из каталога, который вы хотите добавить, или ссылаться на каталог как на первый и только на параметр:

$ ignore_dir ./some/directory

Еще один вариант (в ответ на комментарий от @GreenAsJade), если вы хотите отслеживать пустую папку, в которой МОЖЕТ содержать отслеживаемые файлы в будущем, но пока пусто, вы можете опустить * из .gitignore и проверить это. В принципе, весь файл говорит: "Не игнорируйте меня", но в противном случае каталог пуст и отслеживается.

Ваш файл .gitignore будет выглядеть так:

!.gitignore

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

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

2

Просто добавьте empty.txt в каталог.

2

Добавьте файл в пустую папку и назовите его PlaceHolder.

2

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

То, что я делал в прошлом, помещает файл .gitignore в корень моего репо, а затем исключает эту папку:

/app/some-folder-to-exclude
/another-folder-to-exclude/*

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

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

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

*
!.gitignore

Первая строка (*) сообщает Git игнорировать все в этом каталоге. Вторая строка сообщает Git не игнорировать файл .gitignore. Вы можете записать этот файл в каждую пустую папку, которую вы хотите добавить в репозиторий.

2

Вы можете сохранить этот код как create_readme.php и запустить PHP код из корневого каталога вашего проекта Git.

> php create_readme.php

Он добавит файлы README ко всем пустым каталогам, чтобы эти каталоги были добавлены в индекс.

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

Тогда do

git commit -m "message"
git push
0

Да, это возможно, но клиент git этого не делает. Смотрите пример репо: https://github.com/damian-rzeszot/git_repo_with_empty_folder

Ещё вопросы

Сообщество Overcoder
Наверх
Меню