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

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

Ответы [ 28 ]

26 голосов
/ 20 января 2012

ВНИМАНИЕ: этот твик не работает, как оказалось. Приносим извинения за неудобства.

Оригинальный пост ниже:

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

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

    $ mkdir path/to/empty-folder
    
  3. Добавьте его в индекс с помощью сантехнической команды и пустого дерева SHA-1 :

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

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

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

Это решение короткое и, по-видимому, работает нормально ( см. РЕДАКТИРОВАТЬ! ), но это не так легко запомнить ...

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

EDIT:

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

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

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

20 голосов
/ 26 октября 2011

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

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
20 голосов
/ 08 октября 2008

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

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

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

14 голосов
/ 24 июля 2009

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

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

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

12 голосов
/ 15 марта 2015

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

Где-то где-то я читал напыщенную речь.

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

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

11 голосов
/ 15 мая 2017

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

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

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

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

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

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

pip3 install gitkeep2

Это позволит вам рекурсивно создавать и удалять .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's important to push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

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

10 голосов
/ 24 сентября 2008

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

8 голосов
/ 22 июня 2014

Решение Jamie Flournoy прекрасно работает. Вот немного улучшенная версия для сохранения .htaccess:

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

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

8 голосов
/ 19 апреля 2011

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

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

Я поместил это в Rakefile для легкого доступа.

7 голосов
/ 27 апреля 2015

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

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

Префикс . помечает его как скрытый файл.

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

...