Возможно ли иметь неглубокие подмодули? У меня есть суперпроект с несколькими подмодулями, каждый из которых имеет длинную историю, поэтому он становится слишком большим, перетаскивая всю эту историю.
Все, что я нашел, является этой оставшейся без ответа веткой .
Должен ли я просто взломать git-submodule для реализации этого?
git
git-submodules
Маурисио Шеффер
источник
источник
git submodule add/update
" теперь можно поверхностно клонировать репозитории субмодулей! Смотрите мой ответ нижеОтветы:
Новое в готовящемся выпуске git1.8.4 (июль 2013 г.) :
(И git 2.10 Q3 2016 позволяет записать это с помощью
git config -f .gitmodules submodule.<name>.shallow true
.См. Конец этого ответа)
Смотрите коммит 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Это означает, что это работает:
С участием:
atwyman добавляет в комментариях :
Это правда.
То есть до 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)В комментариях MVG указывает на коммит fb43e31 (git 2.9, февраль 2016 г.)
Обновление август 2016 (3 года спустя)
С Git 2.10 (3 квартал 2016 года) вы сможете делать
Смотрите " Git submodule без лишнего веса " для более подробной информации.
Git 2.13 (второй квартал 2017 года) добавлен в коммит 8d3047c (19 апреля 2017 года) Себастьяном Шубертом (
sschuberth
) .(Объединено Себастьяном Шубертом -
sschuberth
- в коммите 8d3047c , 20 апреля 2017 г.)Тем не менее, Сиро Сантилли добавляет в комментариях (и подробности в своем ответе )
В 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)Примечание: 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)Предупреждение: В Git 2.25 (Q1 2020) взаимодействие между "
git clone --recurse-submodules
" и хранилищем альтернативных объектов было плохо спроектировано.Смотрите коммит 4f3e57e , коммит 10c64a0 (02 декабря 2019 г.) Джонатана Тана (
jhowtan
) .(Слиты Junio C Hamano -
gitster
- в фиксации 5dd1d59 , 10 дек 2019)Это подробно описано в:
В Git 2.25 (Q1 2020) взаимодействие между "git clone --recurse-submodules" и хранилищем альтернативных объектов было плохо разработано.
Документация подмодуля config теперь включает в себя:
источник
--depth
шоудл тоже поспоришь;)uploadpack.allowReachableSHA1InWant
иuploadpack.allowTipSHA1InWant
настройки на сервере, вероятно , повлияет ли это работает. Сегодня я написал сообщение в список git , в котором указывалось, как использовать мелкие подмодули, чтобы они работали лучше для некоторых сценариев, а именно, если commit также является тегом. Давайте подождем и посмотрим..gitmodules
работает ли--depth 1
опция для ветвей, которые не отслеживают мастер?Git 2.9.0 поддерживает субмодули мелкого клона напрямую, так что теперь вы можете просто позвонить:
источник
После ответа Райана я смог придумать этот простой скрипт, который перебирает все подмодули и мелко клонирует их:
источник
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
за каждый подмодульЧитая «исходный код» подмодуля git, похоже, он
git submodule add
может обрабатывать подмодули, в которых уже есть свои репозитории. В таком случае...Вы хотите убедиться, что требуемый коммит находится в репозитории подмодулей, поэтому убедитесь, что вы установили соответствующий параметр --depth.
Редактировать: Вы можете избежать нескольких клонов субмодулей вручную с последующим одним обновлением:
источник
Резюме ошибочного / неожиданного / раздражающего поведения на Git 2.14.1
shallow = true
в.gitmodules
затрагивает толькоgit clone --recurse-submodules
еслиHEAD
из удаленных точек подмодуля в требуемое обязательство, даже если цель коммита указывает ветвь, и даже если вы поставитеbranch = mybranch
на.gitmodules
а.Локальный тестовый скрипт . Такое же поведение на GitHub 2017-11, где
HEAD
управляется настройкой репо филиала по умолчанию:git clone --recurse-submodules --shallow-submodules
не выполняется , если обязательство не является ни ссылается ответвления или метки с сообщением:error: Server does not allow request for unadvertised object
.Локальный тестовый скрипт . Такое же поведение на GitHub:
Я также спросил в списке рассылки: https://marc.info/?l=git&m=151863590026582&w=2 и получил ответ:
Тест TODO:
allowReachableSHA1InWant
.источник
git clone --recursive
которые выбирают только этот конкретный коммит.Канонические места для ваших подмодулей удалены? Если да, то можете ли вы клонировать их один раз? Другими словами, хотите ли вы мелкие клоны только потому, что вы страдаете от потери пропускной способности частых субмодульных (ре) клонов?
Если вы хотите, чтобы мелкие клоны сохраняли локальное дисковое пространство, тогда ответ Райана Грэма выглядит хорошим способом. Вручную клонировать репозитории, чтобы они были мелкими. Если вы думаете, что это будет полезно, адаптируйтесь,
git submodule
чтобы поддержать его. Отправить письмо в список просьбой об этом (советы по его реализации, предложения по интерфейсу и т. Д.). По моему мнению, люди вполне поддерживают потенциальных участников, которые искренне хотят улучшить Git конструктивным образом.Если вы в порядке с выполнением одного полного клона каждого подмодуля (плюс более поздние выборки, чтобы поддерживать их актуальность), вы можете попытаться использовать
--reference
опциюgit submodule update
(это в Git 1.6.4 и более поздних версиях) для ссылки на локальные хранилища объектов (например, создайте--mirror
клоны из канонических репозиториев подмодулей, затем используйте их--reference
в своих подмодулях, чтобы указать на эти локальные клоны). Просто не забудьте прочитать оgit clone --reference
/git clone --shared
перед использованием--reference
. Единственная вероятная проблема со ссылками на зеркала - это если они когда-нибудь получат обновления без ускоренной пересылки (хотя вы можете включить повторные журналы и расширить их окна истечения срока действия, чтобы помочь сохранить любые оставленные коммиты, которые могут вызвать проблему). У вас не должно быть никаких проблем, покаЕсли вы идете с чем-то вроде этого, и есть вероятность, что вы можете выполнять локальные коммиты субмодулей в ваших рабочих деревьях, вероятно, будет хорошей идеей создать автоматизированную систему, которая будет гарантировать, что критические объекты, на которые ссылаются извлеченные субмодули, не являются оставленный висящий в зеркальных хранилищах (и, если таковые имеются, копирует их в нужные им хранилища).
И, как
git clone
говорится на странице руководства , не используйте,--reference
если вы не понимаете этих последствий.В качестве альтернативы
--reference
вы можете использовать зеркальные клоны в сочетании с функцией жестких ссылок по умолчаниюgit clone
, используя локальные зеркала в качестве источника для ваших подмодулей. В новых клонах супер-проекта выполнитеgit submodule init
редактирование URL-адресов субмодуля,.git/config
чтобы они указывали на локальные зеркала, а затем выполнитеgit submodule update
. Вам нужно будет отложить любые существующие проверенные подмодули, чтобы получить жесткие ссылки. Вы бы сэкономили пропускную способность, загрузив только один раз в зеркала, а затем загрузив локально из них в свои проверенные подмодули. Жесткое связывание позволит сэкономить дисковое пространство (хотя выборки будут иметь тенденцию накапливаться и дублироваться в нескольких экземплярах хранилищ объектов извлеченных подмодулей; вы можете периодически отгибать извлеченные подмодули из зеркал, чтобы восстановить экономию дискового пространства, обеспечиваемую hardlinking).источник
Я создал немного другую версию, когда она не работает на переднем крае, что не все проекты делают. Стандартные дополнения к субмодулям не работали, как и скрипт выше. Поэтому я добавил поиск хеша для тега ref, и если у него его нет, он возвращается к полному клонированию.
источник
Ссылка на Как клонировать git-репозиторий с определенной ревизией / набором изменений?
Я написал простой скрипт, который не имеет проблем, когда ваша ссылка на подмодуль находится в стороне от мастера
Это утверждение будет извлекать ссылочную версию субмодуля.
Это быстро, но вы не можете зафиксировать ваши изменения в подмодуле (вы должны получить его до отмены https://stackoverflow.com/a/17937889/3156509 )
в полном объеме:
источник
Мелкий клон подмодуля идеален, потому что они делают снимок при определенной ревизии / наборе изменений. Скачать zip с сайта очень просто, поэтому я попробовал скрипт.
git submodule deinit --all -f
очищает дерево подмодулей, что позволяет использовать скрипт.git submodule
извлекает 40 символов sha1, за которыми следует путь, соответствующий тому же значению in.gitmodules
. Я использую Perl для объединения этой информации, разделенной двоеточием, а затем использую преобразование переменных для разделения значений наmysha
иmysub
.Это критические ключи, потому что нам нужен sha1 для загрузки и путь для корреляции
url
в .gitmodules.Учитывая типичную запись субмодуля:
myurl
Ключиpath =
затем выглядит 2 строки после, чтобы получить значение. Этот метод может не работать последовательно и требует доработки. Grep url удаляет все оставшиеся.git
ссылки на типы, сопоставляя их с последним/
и любым до.
.mydir
этоmysub
минус окончательной ,/name
который будет каталог , ведущим к имени подмодуль.Далее идет
wget
с форматом загружаемого zip архива url. Это может измениться в будущем.Разархивируйте файл, в
mydir
который будет находиться подкаталог, указанный в пути к субмодулю. Результирующая папка будет последним элементомurl
-sha1
.Проверьте, существует ли подкаталог, указанный в пути к субмодулю, и удалите его, чтобы разрешить переименование извлеченной папки.
mv
переименуйте извлеченную папку, содержащую наш sha1, в правильный путь к субмодулю.Удалить загруженный почтовый файл.
Подмодуль init
Это скорее подтверждение концепции, а не решение. Когда это работает, результатом является неглубокий клон подмодуля с указанным набором изменений.
Если в хранилище повторно размещен субмодуль для другой фиксации, повторно запустите скрипт для обновления.
Единственный раз, когда такой сценарий будет полезен, это локальное построение исходного проекта без совместной работы.
источник