Новое в готовящемся выпуске git1.8.4 (июль 2013 г.) :
" git submodule update
" может необязательно клонировать репозитории субмодулей.
(И git 2.10 Q3 2016 позволяет записать это с помощью git config -f .gitmodules submodule.<name>.shallow true
.
См. Конец этого ответа)
Смотрите коммит 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Добавьте --depth
опцию к командам добавления и обновления «git submodule», которая затем передается команде clone. Это полезно, когда субмодуль (ы) огромен, и вы на самом деле не заинтересованы ни в чем, кроме последнего коммита.
Добавлены тесты и внесены некоторые коррективы в отступы, чтобы они соответствовали остальной части тестового файла: «Обновление подмодуля может обрабатывать символические ссылки в 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 напрямую доступен с одного из удаленных репозиториев HEAD.
См. Коммит fb43e31 (24 февраля 2016 г.) Стефана Беллера ( stefanbeller
) .
Помогает: Junio C Hamano ( gitster
) .
(Слиты Junio C Hamano - gitster
- в фиксации 9671a76 , 26 Feb 2016)
субмодуль: стараться изо всех сил выбрать нужный sha1 путем прямого выбора sha1
При проверке изменения, которое также обновляет подмодуль в Gerrit, обычной практикой проверки является загрузка и выборочная установка патча локально для его тестирования.
Однако при локальном тестировании ' git submodule update
' может не удастся выбрать правильный подмодуль sha1, поскольку соответствующий коммит в подмодуле еще не является частью истории проекта, но также является предложенным изменением.
Если $sha1
не было частью выборки по умолчанию, мы пытаемся получить $sha1
напрямую . Однако некоторые серверы не поддерживают прямую выборку с помощью sha1, что приводит git-fetch
к быстрому сбою.
Мы можем здесь потерпеть неудачу, так как все еще отсутствующий sha1 в любом случае приведет к неудаче на этапе оформления заказа, поэтому неудача здесь настолько хороша, насколько мы можем это сделать.
В комментариях MVG указывает на коммит fb43e31 (git 2.9, февраль 2016 г.)
Казалось бы , что мне совершить fb43e31 запросы недостающее совершать по SHA1 идентификатор, так uploadpack.allowReachableSHA1InWant
и uploadpack.allowTipSHA1InWant
настройки на сервере, вероятно , повлияет ли это работает. Сегодня
я написал сообщение в список git , в котором указывалось, как использовать мелкие подмодули, чтобы они работали лучше для некоторых сценариев, а именно, если commit также является тегом.
Давайте подождем и посмотрим.
Я предполагаю, что это причина, почему fb43e31 сделал выборку для конкретного SHA1 резервным после выборки для ветви по умолчанию.
Тем не менее, в случае «--depth 1» я думаю, что было бы целесообразно прервать работу раньше: если ни один из перечисленных ссылок не соответствует запрошенному, и запрос от SHA1 не поддерживается сервером, то нет смысла получить что-нибудь, так как мы не сможем удовлетворить требование субмодуля в любом случае.
Обновление август 2016 (3 года спустя)
С Git 2.10 (3 квартал 2016 года) вы сможете делать
git config -f .gitmodules submodule.<name>.shallow true
Смотрите " Git submodule без лишнего веса " для более подробной информации.
Git 2.13 (второй квартал 2017 года) добавлен в коммит 8d3047c (19 апреля 2017 года) Себастьяном Шубертом ( sschuberth
) .
(Объединено Себастьяном Шубертом - sschuberth
- в коммите 8d3047c , 20 апреля 2017 г.)
клон этого подмодуля будет выполнен как мелкий клон (с глубиной истории 1)
Тем не менее, Сиро Сантилли добавляет в комментариях (и подробности в своем ответе )
shallow = true
на .gitmodules
влияет только ссылка отслеживаются ГОЛОВЕ пульта дистанционного при использовании --recurse-submodules
, даже если цель коммита указывает ветвь, и даже если вы поставите branch = mybranch
на.gitmodules
а.
В Git 2.20 (Q4 2018) улучшена поддержка субмодулей, которая была обновлена для чтения из большого двоичного объекта по адресу HEAD:.gitmodules
когда .gitmodules
файл отсутствует в рабочем дереве.
См. Коммит 2b1257e , коммит 76e9bdc (25 октября 2018 г.) и коммит b5c259f , коммит 23dd8f5 , коммит b2faad4 , коммит 2502ffc , коммит 996df4d , коммит d1b13df , коммит 45f5ef3 , коммит 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
рабочего дерева.
Примечание: Git 2.24 (Q4 2019) исправляет возможную ошибку сегмента при клонировании мелкого субмодуля.
См. Коммит ddb3c85 (30 сентября 2019 г.) Али Утку Селен ( auselen
) .
(Слиты Junio C Hamano - gitster
- в фиксации 678a9ca , 09 окт 2019)
Git 2.25 (Q1 2020), уточняет git submodule update
документацию.
См. Сообщение f0e58b3 (24 ноября 2019 г.) от Philippe Blain ( phil-blain
) .
(Слиты Junio C Hamano - gitster
- в фиксации ef61045 , 05 дек 2019)
doc
: упомяните, что 'git submodule update' выбирает отсутствующие коммиты
Помощник: Джунио С. Хамано.
Помощник: Йоханнес Шинделин
Подпись: Филипп Блен
« git submodule
update» будет получать новые коммиты с пульта субмодуля, если SHA-1, записанный в суперпроекте, не найден . Это не было упомянуто в документации.
Предупреждение: В Git 2.25 (Q1 2020) взаимодействие между " git clone --recurse-submodules
" и хранилищем альтернативных объектов было плохо спроектировано.
Документация и код были научены давать более четкие рекомендации, когда пользователи видят сбои.
Смотрите коммит 4f3e57e , коммит 10c64a0 (02 декабря 2019 г.) Джонатана Тана ( jhowtan
) .
(Слиты Junio C Hamano - gitster
- в фиксации 5dd1d59 , 10 дек 2019)
submodule--helper
: посоветуйте фатальную альтернативную ошибку
Подписано: Джонатан Тан
Автор: Джефф Кинг
При рекурсивном клонировании суперпроекта с некоторыми мелкими модулями, определенными в его .gitmodules
, и последующем клонировании с " --reference=<path>
" возникает ошибка. Например:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
не удается с:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Если альтернатива, вычисленная из альтернативы суперпроекта, не может быть добавлена, будь то в этом или другом случае, посоветуйте настроить параметр « submodule.alternateErrorStrategy
» и использовать « --reference-if-able
» вместо « --reference
» при клонировании.
Это подробно описано в:
В Git 2.25 (Q1 2020) взаимодействие между "git clone --recurse-submodules" и хранилищем альтернативных объектов было плохо разработано.
Doc
: объяснение submodule.alternateErrorStrategy
Подписано: Джонатан Тан
Автор: Джефф Кинг
Commit 31224cbdc7 (« clone
: альтернативы рекурсивных и опорных опций запускают субмодульные альтернативы», 2016-08-17, Git v2.11.0-rc0 - слияние, перечисленное в пакете № 1 ) научил Git поддерживать параметры конфигурации « submodule.alternateLocation
» и « submodule.alternateErrorStrategy
» в суперпроекте ,
Если " submodule.alternateLocation
" настроен на " superproject
" в суперпроекте, всякий раз, когда подмодуль этого суперпроекта клонируется, он вместо этого вычисляет аналогичный альтернативный путь для этого подмодуля из $GIT_DIR/objects/info/alternates
суперпроекта и ссылается на него.
Опция " submodule.alternateErrorStrategy
" определяет, что произойдет, если на эту альтернативу нельзя ссылаться.
Тем не менее, не ясно, что клон работает так, как если бы не был указан альтернативный вариант, если для этого параметра не задано значение «die» (как видно из тестов в 31224cbdc7 ).
Поэтому, документируйте это соответственно.
Документация подмодуля config теперь включает в себя:
submodule.alternateErrorStrategy::
Определяет, как обрабатывать ошибки с альтернативами для подмодуля, вычисленные с помощью submodule.alternateLocation
.
Возможные значения ignore
, info
, die
.
По умолчанию это die
.
Обратите внимание, что если установлено значение ignore
или info
, и если есть ошибка с вычисленной альтернативой, клон будет работать так, как если бы альтернатива не была указана .
git submodule add/update
" теперь можно поверхностно клонировать репозитории субмодулей! Смотрите мой ответ ниже