Как я могу добавить пустой каталог (который не содержит файлов) в репозиторий Git?
Как я могу добавить пустой каталог (который не содержит файлов) в репозиторий Git?
Ответы:
Другой способ сохранить каталог (почти) пустым (в хранилище) - создать в .gitignore
этом каталоге файл, содержащий следующие четыре строки:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Тогда вам не нужно правильно оформлять заказ, как в решении m104. .
Это также дает то преимущество, что файлы в этом каталоге не будут отображаться как «неотслеживаемые», когда вы выполняете состояние git.
Сделать комментарий @GreenAsJade постоянным:
Я думаю, что стоит отметить, что это решение делает именно то, о чем просил вопрос, но, возможно, это не то, что искали многие люди, смотрящие на этот вопрос. Это решение гарантирует, что каталог остается пустым. Он говорит: «Я действительно никогда не хочу, чтобы файлы проверялись здесь». В отличие от «У меня пока нет файлов для проверки, но мне нужен каталог здесь, файлы могут появиться позже».
README
внутри .gitignore
файла (в качестве комментариев).
Ты не можешь Смотрите Git FAQ .
В настоящее время дизайн индекса git (промежуточной области) разрешает только перечисление файлов, и никто, достаточно компетентный, чтобы внести изменения, чтобы пустые каталоги могли достаточно позаботиться об этой ситуации, чтобы исправить ее.
Каталоги добавляются автоматически при добавлении файлов внутри них. То есть каталоги никогда не нужно добавлять в репозиторий, и они не отслеживаются сами по себе.
Ты можешь сказать "
git add <dir>
", и он добавит туда файлы.Если вам действительно нужен каталог для оформления покупок, вы должны создать в нем файл. .gitignore хорошо работает для этой цели; Вы можете оставить его пустым или указать имена файлов, которые вы ожидаете увидеть в каталоге.
git mv
поскольку git будет жаловаться, что новый каталог не находится под контролем версий
.gitignore
Трюк является частым ответом, и удовлетворяет многие потребности. Однако возможно сделать git track действительно пустым каталогом, смотрите мой ответ
.gitkeep
для этой цели.
Создайте пустой файл с именем .gitkeep
в каталоге и добавьте его.
.gitkeep
не было предписано Git и заставит людей вторично угадать его значение, что приведет их к поискам в Google, которые приведут их сюда. Соглашение о .git
префиксе должно быть зарезервировано для файлов и каталогов, которые использует сам Git.
.git
Префиксное соглашение должно быть зарезервировано ..." Почему? Git запрашивает это бронирование?
README
или был ABOUT
бы таким же хорошим или лучшим. Оставить записку для следующего парня, как мы все делали до URL.
Вы всегда можете поместить файл README в каталог с объяснением, почему вы хотите этот, иначе пустой каталог, в репозитории.
touch .keep
В Linux это создает пустой файл с именем .keep
. Что бы это ни стоило, это имя не относится к Git, тогда как оно относится .gitkeep
к Git. Во-вторых, как отметил другой пользователь,.git
соглашение префиксе должно быть зарезервировано для файлов и каталогов, которые использует сам Git.
В качестве альтернативы, как отмечено в другом ответе , каталог может содержать описательный README
или README.md
файл вместо этого.
Конечно, это требует, чтобы присутствие файла не приводило к разрыву приложения.
.keep
файл или просто проигнорируйте его. Если вместо этого файлы в каталоге нужно игнорировать, это совсем другой вопрос.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
сделать это во всех неотслеживаемых пустых каталогах.
Перво-наперво:
Пустой каталог не может быть частью дерева в системе управления версиями Git .
Это просто не будет отслеживаться. Но есть сценарии, в которых «управление версиями» пустых каталогов может иметь смысл, например:
cache/
или logs/
, где мы хотим предоставить папку, но .gitignore
ее содержимоеМногие пользователи предлагают:
README
файл или другой файл с некоторым содержимым, чтобы сделать каталог не пустым, или.gitignore
файла с некой «обратной логикой» (то есть включающей все файлы), которая, в конце концов, служит той же цели подхода № 1.Хотя оба решения обязательно работают я считаю, что они несовместимы с осмысленным подходом к Git-версиям.
.gitignore
что-то ( хранение файлов), прямо противоположное тому, для чего оно предназначено ( исключая файлы), даже если это возможно?Используйте пустой файл с именем.gitkeep
для принудительного присутствия папки в системе управления версиями.
Хотя это может показаться не такой большой разницей
Вы используете файл с единственным цель сохранения папки. Вы не помещаете туда информацию, которую не хотите помещать.
Например, вы должны использовать README в качестве README с полезной информацией, а не в качестве предлога для сохранения папки.
Разделение проблем - это всегда хорошо, и вы все равно можете добавить, .gitignore
чтобы игнорировать ненужные файлы.
Присвоение имени .gitkeep
делает это очень ясным и понятным из самого имени файла (а также для других разработчиков , что хорошо для общего проекта и одной из основных целей репозитория Git), что этот файл
Я видел .gitkeep
подход, принятый очень важными средами , такими как Laravel , Angular-CLI .
.gitkeep
любым другим именем файла без префикса git, вы получите мое возражение, я думаю, что этот ответ является лучшим и наиболее информативным. Причина: я думаю, что ".git *" должен быть зарезервирован для файлов, предписанных git, в то время как это просто заполнитель. Мое первое предположение, когда я увидел, что, например, файл «.gitkeep» будет автоматически игнорироваться (это было бы неплохо), но это не так, верно?
Как описано в других ответах, Git не может представлять пустые каталоги в своей промежуточной области. (См. Git FAQ .) Однако, если для ваших целей каталог достаточно пуст, если он содержит .gitignore
только файл, вы можете создавать .gitignore
файлы в пустых каталогах только через:
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
а затем использовать предпочтительный вариант из этого ответа. Обязательно выполняйте это только в правильной папке!
.gitignore
не влияет на -empty
флаг find
команды. Мой комментарий касается удаления .DS_Store
файлов в дереве каталогов, поэтому -empty
флаг можно применить.
Энди Лестер прав, но если ваш каталог просто должен быть пустым, а не пустым пустым, вы можете поместить туда пустой .gitignore
файл в качестве обходного пути.
Кроме того, это проблема реализации, а не фундаментальная проблема проектирования хранилища Git. Как уже много раз упоминалось в списке рассылки Git, причина того, что это не было реализовано, заключается в том, что никто не позаботился о том, чтобы представить патч для него, а не то, что это не может или не должно быть сделано.
Способ создания папки журнала Ruby on Rails :
mkdir log && touch log/.gitkeep && git add log/.gitkeep
Теперь каталог журналов будет включен в дерево. Это очень полезно при развертывании, поэтому вам не придется писать подпрограмму для создания каталогов журналов.
Лог-файлы могут быть сохранены путем выдачи,
echo log/dev.log >> .gitignore
но вы, наверное, знали это.
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
ВНИМАНИЕ: этот твик не работает, как оказалось. Приносим извинения за неудобства.
Оригинальный пост ниже:
Я нашел решение, играя с внутренностями Git!
Создайте свой пустой каталог:
$ mkdir path/to/empty-folder
Добавьте его в индекс, используя команду сантехника и пустое дерево SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Введите команду и введите вторую строку. Нажмите, Enterа затем Ctrl+, Dчтобы завершить ввод. Примечание: формат режима [SPACE], тип [SPACE] SHA-1hash [TAB] путь (вкладка важна, форматирование ответа не сохраняет его).
Это оно! Ваша пустая папка находится в вашем индексе. Все, что вам нужно сделать, это совершить.
Это решение короткое и, видимо, работает нормально ( см. РЕДАКТИРОВАТЬ! ), Но это не так легко запомнить ...
Пустое дерево SHA-1 можно найти, создав в нем новый пустой репозиторий Git cd
и git write-tree
выполнив команду, которая выведет пустое дерево SHA-1.
РЕДАКТИРОВАТЬ:
Я использую это решение, так как я нашел его. Похоже, что он работает точно так же, как и создание подмодуля, за исключением того, что нигде не определен ни один модуль. Это приводит к ошибкам при выдаче git submodule init|update
. Проблема в том, что git update-index
переписывает 040000 tree
часть в160000 commit
.
Более того, любой файл, помещенный по этому пути, никогда не будет замечен Git, так как он думает, что он принадлежит другому хранилищу. Это противно, поскольку это может легко быть пропущено!
Однако, если вы еще не используете (и не будете) использовать подмодули Git в своем хранилище, и «пустая» папка останется пустой или если вы хотите, чтобы Git знал о ее существовании и игнорировал ее содержимое, вы можете перейти с этот твик. Путь к субмодулям в обычном режиме требует больше шагов, чем этот твик.
git svn dcommit
это с желаемым результатом?
Допустим, вам нужен пустой каталог с именем tmp :
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
Другими словами, вам нужно добавить файл .gitignore в индекс, прежде чем вы сможете указать Git игнорировать его (и все остальное в пустом каталоге).
echo bla > file
вы не получите, file: File exists
потому >
что перезапишете файл, если он уже существует, или создайте новый, если он не существует.
/bin/sh
культурное предположение! * Если «здесь» csh
и переменная noclobber
установлена, вы действительно получите file: File exists
. Если кто-то говорит: «Я понимаю это», не думайте, что он идиот, и отвечайте «Нет, вы не знаете». * c2.com/cgi/wiki?AmericanCulturalAssuming
Может быть, добавление пустого каталога выглядит как путь наименьшего сопротивления, потому что у вас есть сценарии, которые ожидают, что этот каталог существует (возможно, потому что он является целью для сгенерированных двоичных файлов). Другой подход заключается в изменении ваших сценариев для создания каталога по мере необходимости .
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
.generated
каталог изначально не существует. Он больше не будет сломан, как только вы сделаете свою сборку.
Я тоже столкнулся с проблемой с пустыми каталогами. Проблема с использованием файлов-заполнителей заключается в том, что вам нужно создавать их и удалять их, если они больше не нужны (потому что позже были добавлены подкаталоги или файлы. С большими деревьями исходного кода управление этими файлами-заполнителями может быть громоздким и приводить к ошибкам. склонный.
Вот почему я решил написать инструмент с открытым исходным кодом, который может автоматически управлять созданием / удалением таких файлов-заполнителей. Он написан для платформы .NET и работает под управлением Mono (.NET для Linux) и Windows.
Просто взгляните на: http://code.google.com/p/markemptydirs
Мне нравятся ответы @ 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.
Я надеюсь, что вы найдете это полезным.
Вы не можете и, к сожалению, никогда не сможете. Это решение принял сам Линус Торвальд. Он знает, что хорошо для нас.
Где-то где-то я читал напыщенную речь.
Я нашел Re: Пустые каталоги .. , но, возможно, есть еще один.
Вы должны жить с обходными путями ... к сожалению.
Когда вы добавляете .gitignore
файл, если вы собираетесь помещать в него какое-либо количество контента (которое вы хотите игнорировать в Git), вы можете добавить одну строку со звездочкой, *
чтобы избежать случайного добавления игнорируемого контента. ,
Нет способа заставить Git отслеживать каталоги, поэтому единственное решение - добавить файл-заполнитель в каталог, который вы хотите отслеживать в Git.
Файл может быть назван и содержать все, что вы хотите, но большинство людей используют пустой файл с именем .gitkeep
(хотя некоторые люди предпочитают VCS-независимость.keep
).
Префикс .
помечает его как скрытый файл.
Другая идея заключается в добавлении README
файла, объясняющего, для чего будет использоваться каталог.
Как уже упоминалось, добавить пустые каталоги невозможно, но вот один вкладыш, который добавляет пустые файлы .gitignore во все каталоги.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
Я вставил это в Rakefile для быстрого доступа.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Решение Джейми Флурной прекрасно работает. Вот немного улучшенная версия, чтобы сохранить .htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
С помощью этого решения вы можете зафиксировать пустую папку, например /log
, /tmp
или /cache
и папка останется пустой.
Я всегда создаю функцию для проверки желаемой структуры папок и создаю ее для меня в рамках проекта. Это решает эту проблему, поскольку пустые папки хранятся в 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, но я уверен, что большинство языков поддерживают одинаковую функциональность, и, поскольку приложение заботится о создании папок, они всегда будут там.
.gitkeep
Конвенция является гораздо лучшей практикой.
Вот взлом, но забавно, что он работает (Git 2.2.1). Подобно тому, что предложила @Teka, но легче запомнить:
git submodule add path_to_repo
).submodules
. Зафиксируйте изменения..submodules
файл и подтвердите изменение.Теперь у вас есть каталог, который создается при извлечении коммита. Интересно то, что если вы посмотрите на содержимое объекта дерева этого файла, вы получите:
Неустранимый: недопустимое имя объекта b64338b90b4209263b50244d18278c0999867193
Я бы не советовал использовать его, так как он может перестать работать в будущих версиях Git. Что может привести к повреждению вашего хранилища.
Многие уже ответили на этот вопрос. Просто добавьте версию PowerShell здесь.
Найти все пустые папки в каталоге
Добавьте туда пустой файл .gitkeep
Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}
Если вы хотите добавить папку, которая будет содержать много временных данных в нескольких семантических каталогах, то один из подходов заключается в том, чтобы добавить что-то подобное в ваш корневой .gitignore ...
/app/data/**/*.*
!/app/data/**/*.md
Затем вы можете зафиксировать описательные файлы README.md (или пустые файлы, не имеет значения, если вы можете назначить их уникально, как *.md
в данном случае -) в каждом каталоге, чтобы убедиться, что все каталоги остаются частью репо, но файлы (с расширениями) игнорируются. ОГРАНИЧЕНИЕ: .
не допускается в именах каталогов!
Вы можете заполнить все эти каталоги файлами xml / images или чем-то еще и добавить /app/data/
со временем дополнительные каталоги по мере развития хранилища для вашего приложения (файлы README.md служат для записи в описании того, для чего предназначен каждый каталог хранения). точно).
Нет необходимости дополнительно изменять .gitignore
или децентрализовать, создавая новый .gitignore
для каждого нового каталога. Вероятно, не самое умное решение, но оно является кратким и всегда работает для меня. Красиво и просто! ;)
Простой способ сделать это - добавить .gitkeep
файл в каталог, который вы хотите (в настоящее время) оставить пустым.
См. Этот ответ SOF для получения дополнительной информации, которая также объясняет, почему некоторые люди находят противоречивое соглашение о добавлении файла .gitignore (как указано во многих ответах здесь).
Добавление еще одного варианта в драке.
Предполагая, что вы хотите добавить каталог, git
который во всех связанных с этим целях git
должен оставаться пустым и никогда не отслеживать его содержимое, .gitignore
как это неоднократно предлагалось здесь, это поможет.
Формат, как уже упоминалось, это:
*
!.gitignore
Теперь, если вам нужен способ сделать это в командной строке, одним махом, а внутри каталога, который вы хотите добавить, вы можете выполнить:
$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore
У меня есть сценарий оболочки, который я использую для этого. Назовите скрипт как хотите, и добавьте его где-нибудь в свой путь включения, или напрямую на него ссылайтесь:
#!/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
цель. В противном случае, кто-то в будущем может подумать, чтобы удалить его. Это может помочь, если вы разместите комментарий над строкой.
Иногда вам приходится иметь дело с плохо написанными библиотеками или программным обеспечением, которому нужен «настоящий» пустой и существующий каталог. Выкладываю простые .gitignore
или .keep
могу их сломать и вызвать ошибку. Следующее может помочь в этих случаях, но без гарантии ...
Сначала создайте нужный каталог:
mkdir empty
Затем вы добавляете неработающую символическую ссылку в этот каталог (но в любом другом случае, кроме описанного выше сценария использования, используйте a 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 ...)
Читая ответы @ofavre и @ stanislav-bashkyrtsev , используя неработающие ссылки на подмодули GIT для создания каталогов GIT, я удивляюсь, что никто еще не предложил эту простую поправку к идее сделать все вменяемым и безопасным:
Вместо того, чтобы взламывать поддельный подмодуль в GIT , просто добавьте пустой реальный .
GIT-репозиторий с ровно одним коммитом:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
Нет сообщений, нет зафиксированных файлов.
Чтобы добавить пустой каталог в GIT-репозиторий:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
Чтобы преобразовать все существующие пустые каталоги в подмодули:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Git будет хранить последний хеш коммита при создании ссылки на подмодуль, поэтому вам не нужно беспокоиться обо мне (или GitLab), используя это для внедрения вредоносных файлов. К сожалению , я не нашел путь к силе, совершение ID используется во время проверки, так что вам придется вручную проверить , что ссылка фиксации идентификатора с e84d7b81f0033399e325b8037ed2b801a5c994e0
помощью git submodule status
после добавления репо.
Тем не менее не является родным решением, но лучшим , что мы , вероятно , можем быть без кого - то получать их руки на самом деле , действительно грязно в кодовой GIT.
Вы должны быть в состоянии воссоздать этот точный коммит, используя (в пустой директории):
# Initialize new GIT repository
git init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"
# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"
# Add root commit
git commit --allow-empty --allow-empty-message --no-edit
Создание воспроизводимых коммитов GIT на удивление сложно ...
Ты не можешь Это намеренное дизайнерское решение от разработчиков Git. По сути, целью системы управления исходным кодом, такой как Git, является управление исходным кодом, а пустые каталоги не являются исходным кодом. Git также часто описывается как трекер контента, и опять же, пустые каталоги не являются контентом (на самом деле наоборот), поэтому они не отслеживаются.
Вы можете сохранить этот код как 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
}
}
?>
Тогда делай
git commit -m "message"
git push
checkout
случится с текущими версиями Git.