Новое в готовящемся выпуске 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 submoduleupdate» будет получать новые коммиты с пульта субмодуля, если 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" теперь можно поверхностно клонировать репозитории субмодулей! Смотрите мой ответ ниже