Новое в предстоящем git1.8.4 (июль 2013) :
"git submodule update
" может произвольно клонировать репозитории субмодулей.
(А git 2.10 Q3 2016 позволяет записывать это с git config -f .gitmodules submodule.<name>.shallow true
.
Смотрите конец этого ответа)
См. commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Добавьте параметр --depth
к командам добавления и обновления «подмодуля git», который затем передается команде клона. Это полезно, когда субмодуль (ы) огромен, и вы на самом деле не заинтересованы ни в чем, кроме последнего коммита.
Добавлены тесты и внесены некоторые изменения в отступы для соответствия остальной части тестового файла в «Обновление подмодуля может обрабатывать символические ссылки в pwd».
Подписано: Фредрик Густафссон <iveqy@iveqy.com>
Автор: Дженс Леманн <Jens.Lehmann@web.de>
Это значит, что это работает:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
С:
--depth::
Эта опция действительна для команд add
и update
.
Создайте «неглубокий» клон с историей, усеченной до указанного количества ревизий.
atwyman добавляет в комментарии :
Насколько я могу судить, эта опция не может использоваться для субмодулей, которые не очень точно отслеживают master
. Если вы установите глубину 1, то submodule update
может быть успешным только в том случае, если требуемый коммит подмодуля является последним мастером. В противном случае вы получите "fatal: reference is not a tree
" .
Это правда.
То есть до git 2.8 (март 2016). В версии 2.8 у submodule update --depth
есть еще один шанс на успех, даже если SHA1 напрямую доступен с одного из головок удаленного репо.
См. commit fb43e31 (24 февраля 2016 г.) от Stefan Beller (stefanbeller
) .
Помощник: Джунио С Хамано (gitster
) .
(Объединено с Junio C Hamano - gitster
- в коммит 9671a76 , 26 февраля 2016 г.)
субмодуль: стараться получить необходимый sha1 прямым путем, выбрав sha1
При просмотре изменения, которое также обновляет подмодуль в Gerrit, обычной практикой проверки является загрузка и выборочная установка патча локально для его тестирования.
Однако при локальном тестировании «git submodule update
» может не получить нужную подмодуль sha1, поскольку соответствующая фиксация в подмодуле еще не является частью истории проекта, но также является предложенным изменением.
Если $sha1
не был частью выборки по умолчанию, мы пытаемся получить $sha1
напрямую . Однако некоторые серверы не поддерживают прямую выборку по sha1, что приводит к быстрому отказу git-fetch
.
Мы можем здесь потерпеть неудачу, так как все еще отсутствующий sha1 в любом случае может привести к сбою на этапе проверки, поэтому неудача здесь настолько хороша, насколько мы можем ее получить.
MVG указывает в комментариях до коммит fb43e31 (git 2.9, февраль 2016 г.)
Мне кажется, что commit fb43e31 запрашивает отсутствующий коммит по идентификатору SHA1, поэтому настройки uploadpack.allowReachableSHA1InWant
и uploadpack.allowTipSHA1InWant
на сервере, вероятно, будут влиять на то, будет ли это работать.
Сегодня я написал сообщение в список git , в котором указывалось, как использовать мелкие подмодули для лучшей работы в некоторых сценариях, а именно, если фиксация также является тегом.
Давайте подождем и посмотрим.
Полагаю, именно поэтому fb43e31 сделал выборку для конкретного SHA1 резервным вариантом после выборки для ветви по умолчанию.
Тем не менее, в случае «--depth 1» я думаю, что было бы целесообразно прервать работу раньше: если ни один из перечисленных ссылок не соответствует запрошенному, и запрос от SHA1 не поддерживается сервером, то нет смысла получить что-нибудь, так как мы не сможем удовлетворить требование субмодуля в любом случае.
Обновление август 2016 г. (3 года спустя)
С Git 2.10 (3 квартал 2016 года) вы сможете делать
git config -f .gitmodules submodule.<name>.shallow true
Подробнее см. * Подмодуль Git без лишнего веса .
Git 2.13 (второй квартал 2017 года) добавляет коммит 8d3047c (19 апреля 2017 года) Себастьян Шуберт (sschuberth
) .
(Объединено Себастьяном Шубертом - sschuberth
- в коммит 8d3047c , 20 апреля 2017 г.)
клон этого подмодуля будет выполнен как мелкий клон (с глубиной истории 1)
Однако Сиро Сантилли добавляет в комментарии (и подробности в своем ответе )
shallow = true
на .gitmodules
влияет только на ссылку, отслеживаемую HEAD пульта дистанционного управления при использовании --recurse-submodules
, даже если на целевую фиксацию указывает ветвь, и даже если вы поставили branch = mybranch
на .gitmodules
а также.
В Git 2.20 (Q4 2018) улучшена поддержка подмодулей, которая была обновлена для чтения из большого двоичного объекта в HEAD:.gitmodules
, когда файл .gitmodules
отсутствует в рабочем дереве.
См. коммит 2b1257e , коммит 76e9bdc (25 октября 2018 г.) и коммит b5c259f , коммит 23dd8f5 , коммит b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 ( 05 октября 2018 г.) Антонио Оспите (ao2
) .
(Объединено с Junio C Hamano - gitster
- в коммит abb4824 , 13 ноября 2018 г.)
submodule
: поддержка чтения .gitmodules
, когда его нет в рабочем дереве
Если файл .gitmodules
недоступен в рабочем дереве, попробуйте
используя содержимое из индекса и из текущей ветви.
Это относится к случаю, когда файл является частью репозитория, но для некоторых
причина, по которой он не проверен, например, из-за редкой проверки.
Это позволяет использовать как минимум команды git submodule
.
который читает файл конфигурации gitmodules
без полного заполнения
рабочее дерево.
Запись в .gitmodules
по-прежнему требует извлечения файла,
так проверьте это перед звонком config_set_in_gitmodules_file_gently
.
Добавьте аналогичную проверку также в git-submodule.sh::cmd_add()
, чтобы предвидеть возможный сбой команды "git submodule add
", когда .gitmodules
не является безопасным для записи; это не позволяет команде оставлять хранилище в ложном состоянии (например, хранилище подмодулей было клонировано, но .gitmodules
не было обновлено из-за сбоя config_set_in_gitmodules_file_gently
).
Более того, поскольку config_from_gitmodules()
теперь получает доступ к глобальному объекту
хранить, необходимо защитить все пути кода, которые вызывают функцию
против одновременного доступа к глобальному хранилищу объектов.
В настоящее время это происходит только в builtin/grep.c::grep_submodules()
, поэтому звоните
grep_read_lock()
перед вызовом кода, включающего config_from_gitmodules()
.
ПРИМЕЧАНИЕ: есть один редкий случай, когда эта новая функция не работает
пока правильно: вложенные подмодули без .gitmodules
в их рабочем дереве.