Нове у майбутньому git1.8.4 (липень 2013) :
" git submodule update
" може за бажанням клонувати дрібно сховища підмодулів.
(І git 2.10 Q3 2016 дозволяє записати це з git config -f .gitmodules submodule.<name>.shallow true
.
Див. Кінець цієї відповіді)
Див. Комісію 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Додайте --depth
параметр до команд додавання та оновлення "підмодуля git", який потім передається команді 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 знаходиться в безпосередній доступності від однієї з віддалених РЕПОГОЛОВІВ.
Див. Комісію fb43e31 (24 лютого 2016 р.) Від Стефана Беллера ( stefanbeller
) .
Допомагає: Хуніо С Хамано ( gitster
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті 9671a76 , 26 лютого 2016 р.)
підмодуль: спробуйте сильніше отримати необхідний sha1 шляхом прямого отримання sha1
Переглядаючи зміну, яка також оновлює підмодуль у Герріті, поширеною практикою огляду є завантаження та вишневий вибір патча на локальному рівні, щоб перевірити його.
Однак під час тестування на локальному рівні " git submodule update
" може не вдатися до отримання правильного підмодуля sha1, оскільки відповідна комісія в підмодулі ще не є частиною історії проекту, а є лише запропонованою зміною.
Якщо $sha1
не було частиною вибору за замовчуванням, ми намагаємось отримати $sha1
безпосередньо . Однак деякі сервери не підтримують функцію sha1, що призводить git-fetch
до швидкого виходу з ладу.
Тут ми можемо зазнати невдачі, оскільки все ще відсутній ша1 призведе до відмови пізніше на етапі оформлення каси, тому невдача тут настільки ж хороша, як ми можемо отримати.
MVG вказує в коментарях до скоєння fb43e31 (мерзотник 2,9, лютий 2016)
Здавалося б , що мені зробити fb43e31 запити відсутню здійснювати по SHA1 ідентифікатор, так uploadpack.allowReachableSHA1InWant
і uploadpack.allowTipSHA1InWant
настройки на сервері, ймовірно , вплине це працює.
Я сьогодні написав допис до списку git , вказуючи, як використання мілководних підмодулів можна зробити так, щоб вони працювали краще для деяких сценаріїв, а саме, якщо фіксація також є тегом.
Почекаємо і подивимось.
Я думаю, це причина, чому fb43e31 зробив випуск для конкретного SHA1 після резервного відгалуження для гілки за замовчуванням.
Тим не менш, у випадку "-depth 1" я вважаю, що було б доцільно перервати рано: якщо жоден із перерахованих списків не відповідає запитуваному, а запит від SHA1 не підтримується сервером, то немає сенсу в отримуючи що-небудь, оскільки ми не зможемо задовольнити вимогу підмодулю.
Оновлення серпня 2016 року (через 3 роки)
З Git 2.10 (Q3 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 , здійснювати 2502ffc , здійснювати 996df4d , здійснювати d1b13df , здійснювати 45f5ef3 , фіксувати bcbc780 (05 жовтня 2018 р.) Антоніо Оспіте ( ao2
) .
(Об’єднав Хуніо С Хамано - 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
) .
(Об'єднав Хуніо С Хамано - gitster
- у комітеті 678a9ca , 09 жовтня 2019 р.)
Git 2,25 (Q1 2020), уточнює git submodule update
документацію.
Див. Комісію f0e58b3 (24 листопада 2019 р.) Від Філіпа Блена ( phil-blain
) .
(Об’єднав Хуніо С Хамано - 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
) .
(Об’єднав Хуніо С Хамано - 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-клоном - повторними підмодулями" та альтернативним сховищем об'єктів була погано спроектована.
Doc
: поясніть підмодуль.alternateErrorStrategy
Підписаний: Джонатан Тан
Акцепт: Джефф Кінг
Фіксувати 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
" визначає, що станеться, якщо на цей замінник не може бути посилання.
Однак незрозуміло, що клон протікає так, ніби не було вказано альтернативного варіанту, коли цей параметр не встановлений для " вмирання " (як це можна побачити в тестах у 31224cbdc7 ).
Тому документуйте це відповідно.
Документація конфігурації підмодуля тепер включає:
submodule.alternateErrorStrategy::
Вказує, як обчислювати помилки з альтернативними для підмодуля як обчислені через submodule.alternateLocation
.
Можливі значення ignore
, info
, die
.
За замовчуванням є die
.
Зауважте, що якщо встановлено ignore
або info
, і якщо є помилка з обчисленим альтернативом, клон триває так, як ніби альтернативний варіант не вказаний .
git submodule add/update
" тепер може дрібно клонувати сховища підмодулів! Дивіться мою відповідь нижче