Nowość w nadchodzącym git1.8.4 (lipiec 2013) :
„ git submodule update
” może opcjonalnie sklonować repozytoria podmodułów płytko.
(I git 2.10 Q3 2016 pozwala to nagrać z git config -f .gitmodules submodule.<name>.shallow true
.
Zobacz koniec tej odpowiedzi)
Zobacz commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Dodaj --depth
opcję do poleceń dodawania i aktualizowania „git submodule”, która jest następnie przekazywana do polecenia clone. Jest to przydatne, gdy podmoduły są ogromne i nie interesuje Cię nic poza najnowszym zatwierdzeniem.
Dodano testy i wprowadzono pewne poprawki wcięć, aby były zgodne z resztą pliku testowego w sekcji „Aktualizacja modułu podrzędnego może obsługiwać dowiązania symboliczne w pwd”.
Podpisał: Fredrik Gustafsson <iveqy@iveqy.com>
Potwierdził: Jens Lehmann<Jens.Lehmann@web.de>
Oznacza to, że to działa:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Z:
--depth::
Ta opcja dotyczy poleceń add
i update
.
Utwórz „płytki” klon z historią skróconą do określonej liczby wersji.
atwyman dodaje w komentarzach :
O ile wiem, ta opcja nie jest użyteczna dla modułów podrzędnych, które nie śledzą master
zbyt dokładnie. Jeśli ustawisz głębokość 1, submodule update
możesz odnieść sukces tylko wtedy, gdy żądane zatwierdzenie podmodułu jest najnowszym wzorcem. W przeciwnym razie otrzymasz „ fatal: reference is not a tree
” .
To prawda.
To znaczy do git 2.8 (marzec 2016). Z 2.8, submodule update --depth
ma jeszcze jedną szansę na sukces, nawet jeśli SHA1 jest bezpośrednio osiągalny z jednego ze zdalnych głowic repozytorium.
Zobacz commit fb43e31 (24 lutego 2016) autorstwa Stefana Bellera ( stefanbeller
) .
Z pomocą: Junio C Hamano ( gitster
) .
(Scalone przez Junio C Hamano - gitster
- w zobowiązaniu 9671a76 , 26 lutego 2016 r.)
podmoduł: spróbuj mocniej pobrać potrzebny sha1 przez bezpośrednie pobranie sha1
Podczas przeglądania zmiany, która aktualizuje również moduł podrzędny w Gerrit, powszechną praktyką jest pobieranie i wybieranie poprawki lokalnie w celu jej przetestowania.
Jednak podczas testowania lokalnego „ git submodule update
” może się nie powieść podczas pobierania prawidłowego modułu podrzędnego sha1, ponieważ odpowiednie zatwierdzenie w module podrzędnym nie jest jeszcze częścią historii projektu, ale także tylko proponowaną zmianą.
Jeśli $sha1
nie było częścią domyślnego pobierania, próbujemy pobrać $sha1
bezpośrednio . Jednak niektóre serwery nie obsługują bezpośredniego pobierania przez sha1, co prowadzi git-fetch
do szybkiej awarii.
Tutaj możemy zawieść siebie, ponieważ wciąż brakujący sha1 i tak doprowadziłby do niepowodzenia na późniejszym etapie kasy, więc niepowodzenie tutaj jest tak dobre, jak to tylko możliwe.
MVG wskazuje w komentarzach na popełnienie fb43e31 (git 2.9, luty 2016)
Wydawałoby mi się, że zatwierdzenie fb43e31 żąda brakującego zatwierdzenia przez identyfikator SHA1, więc ustawienia uploadpack.allowReachableSHA1InWant
i uploadpack.allowTipSHA1InWant
na serwerze prawdopodobnie wpłyną na to, czy to zadziała.
Napisałem dzisiaj post do listy git , wskazując, w jaki sposób użycie płytkich podmodułów może działać lepiej w niektórych sytuacjach, a mianowicie, jeśli zatwierdzenie jest również tagiem.
Poczekajmy i zobaczmy.
Myślę, że jest to powód, dla którego fb43e31 sprawił, że pobieranie dla określonego SHA1 było rezerwą po pobraniu dla domyślnej gałęzi.
Niemniej jednak, w przypadku „--depth 1” myślę, że rozsądne byłoby przerwanie wcześniejszej przerwy: jeśli żaden z wymienionych ref nie pasuje do żądanego, a zapytanie przez SHA1 nie jest obsługiwane przez serwer, to nie ma sensu pobieranie czegokolwiek, ponieważ w żaden sposób nie będziemy w stanie spełnić wymagań modułu podrzędnego.
Aktualizacja sierpień 2016 (3 lata później)
Dzięki Git 2.10 (III kwartał 2016 r.) Będziesz w stanie to zrobić
git config -f .gitmodules submodule.<name>.shallow true
Zobacz „ Moduł podrzędny Git bez dodatkowej wagi ”, aby uzyskać więcej informacji.
Git 2.13 (Q2 2017) dodaje w zatwierdzeniu 8d3047c (19 kwietnia 2017) autorstwa Sebastiana Schubertha ( sschuberth
) .
(Scalone przez Sebastiana Schubertha - sschuberth
- w zobowiązaniu 8d3047c , 20 kwietnia 2017 r.)
klon tego submodułu zostanie wykonany jako płytki klon (z głębokością historii 1)
Jednak Ciro Santilli dodaje w komentarzach (i szczegółach w swojej odpowiedzi )
shallow = true
na .gitmodules
tylko wpływa na odniesienie śledzone przez szefa pilocie podczas używania --recurse-submodules
, nawet jeśli cel popełnić jest wskazywany przez oddział, a nawet jeśli umieścić branch = mybranch
na .gitmodules
jak dobrze.
Git 2.20 (Q4 2018) ulepsza obsługę modułu podrzędnego, który został zaktualizowany do odczytu z obiektu BLOB w HEAD:.gitmodules
przypadku .gitmodules
braku pliku w drzewie roboczym.
Zobacz commit 2b1257e , commit 76e9bdc (25 października 2018) i commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 Oct 2018) autor: Antonio Ospite ( ao2
) .
(Scalone przez Junio C Hamano - gitster
- w zobowiązaniu abb4824 , 13 listopada 2018 r.)
submodule
: obsługuje czytanie, .gitmodules
gdy nie ma go w drzewie roboczym
Jeśli .gitmodules
plik nie jest dostępny w drzewie roboczym, spróbuj użyć zawartości z indeksu iz bieżącej gałęzi.
Obejmuje to przypadek, gdy plik jest częścią repozytorium, ale z jakiegoś powodu nie jest wyewidencjonowany, na przykład z powodu rzadkiego pobierania.
To sprawia, że możliwe jest wykorzystanie przynajmniej „ git submodule
” polecenia, które czytają ten gitmodules
plik konfiguracyjny bez pełnego wypełniania drzewa roboczą.
Zapis do .gitmodules
nadal będzie wymagał wyewidencjonowania pliku, więc sprawdź to przed wywołaniem config_set_in_gitmodules_file_gently
.
Dodaj podobne sprawdzenie również, git-submodule.sh::cmd_add()
aby przewidzieć ewentualne niepowodzenie git submodule add
polecenia „ ”, gdy .gitmodules
nie można go bezpiecznie zapisać; zapobiega to pozostawieniu przez polecenie repozytorium w stanie fałszywym (np. repozytorium modułu podrzędnego zostało sklonowane, ale .gitmodules
nie zostało zaktualizowane z powodu config_set_in_gitmodules_file_gently
niepowodzenia).
Ponadto, ponieważ config_from_gitmodules()
teraz uzyskuje dostęp do globalnej składnicy obiektów, konieczne jest zabezpieczenie wszystkich ścieżek kodu, które wywołują funkcję, przed równoczesnym dostępem do globalnej składnicy obiektów.
Obecnie dzieje się tak tylko w builtin/grep.c::grep_submodules()
, więc wywołaj
grep_read_lock()
przed wywołaniem kodu obejmującego config_from_gitmodules()
.
UWAGA: istnieje jeden rzadki przypadek, w którym ta nowa funkcja nie działa jeszcze poprawnie: zagnieżdżone podmoduły bez .gitmodules
w ich drzewie roboczym.
Uwaga: Git 2.24 (Q4 2019) naprawia możliwy błąd segregacji podczas klonowania płytkiego podmodułu.
Zobacz commit ddb3c85 (30 września 2019) autorstwa Ali Utku Selen ( auselen
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 678a9ca , 09 października 2019)
Git 2.25 (Q1 2020), wyjaśnia git submodule update
dokumentację.
Zobacz commit f0e58b3 (24 listopada 2019) autorstwa Philippe Blaina ( phil-blain
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu ef61045 , 05 grudnia 2019)
doc
: wspomnij, że 'git submodule update' pobiera brakujące zatwierdzenia
Pomoc: Junio C Hamano
Pomoc: Johannes Schindelin
Podpisał: Philippe Blain
' git submodule
update' pobierze nowe zatwierdzenia ze zdalnego submodułu, jeśli SHA-1 zapisany w superprojekcie nie zostanie znaleziony . Nie było to wspomniane w dokumentacji.
Ostrzeżenie: W Git 2.25 (Q1 2020) interakcja między „ git clone --recurse-submodules
” a alternatywną składnicą obiektów była źle zaprojektowana.
Nauczono dokumentacji i kodu, aby przedstawiać bardziej jasne zalecenia, gdy użytkownicy widzą awarie.
Zobacz commit 4f3e57e , commit 10c64a0 (02 grudnia 2019) autorstwa Jonathan Tan ( jhowtan
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 5dd1d59 , 10 grudnia 2019 r.)
submodule--helper
: porady dotyczące krytycznego błędu alternatywnego
Podpisał: Jonathan Tan
Potwierdził: Jeff King
Podczas rekurencyjnego klonowania superprojektu z niektórymi płytkimi modułami zdefiniowanymi w jego .gitmodules
, a następnie ponownego klonowania za pomocą „ --reference=<path>
”, pojawia się błąd. Na przykład:
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
zawodzi z:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Gdy nie można dodać alternatywy obliczonej na podstawie alternatywy superprojektu, czy to w tym czy innym przypadku, radzimy submodule.alternateErrorStrategy
skonfigurować opcję konfiguracyjną " " i używać " --reference-if-able
" zamiast " --reference
" podczas klonowania.
Jest to szczegółowo opisane w:
W Git 2.25 (Q1 2020) interakcja między "git clone --recurse-submodules" a alternatywnym magazynem obiektów była źle zaprojektowana.
Doc
: wyjaśnij submodule.alternateErrorStrategy
Podpisał: Jonathan Tan
Potwierdził: Jeff King
Commit 31224cbdc7 (" clone
: opcja rekurencyjna i referencyjna wyzwala alternatywy podmodułu", 2016-08-17, Git v2.11.0-rc0 - scalanie wymienione w partii nr 1 ) nauczyło Git obsługiwać opcje konfiguracyjne " submodule.alternateLocation
" i " submodule.alternateErrorStrategy
" superprojektu .
Jeśli „ submodule.alternateLocation
” jest skonfigurowany na „ superproject
” w superprojekcie, za każdym razem, gdy klonowany jest podmoduł tego superprojektu, zamiast tego oblicza analogiczną ścieżkę alternatywną dla tego $GIT_DIR/objects/info/alternates
modułu podrzędnego z superprojektu i odwołuje się do niego.
Opcja „ submodule.alternateErrorStrategy
” określa, co się stanie, jeśli nie można się odwołać do tej alternatywy.
Jednak nie jest jasne, czy klon przebiega tak, jakby nie określono alternatywy, gdy ta opcja nie jest ustawiona na „die” (co widać w testach w 31224cbdc7 ).
Dlatego należy to odpowiednio udokumentować.
Dokumentacja modułu podrzędnego konfiguracji zawiera teraz:
submodule.alternateErrorStrategy::
Określa, jak traktować błędy z zamiennikami dla modułu podrzędnego obliczonymi za pośrednictwem submodule.alternateLocation
.
Możliwe są następujące wartości ignore
, info
, die
.
Domyślnie jest die
.
Zauważ, że jeśli jest ustawiona na ignore
lub info
i jeśli wystąpi błąd w obliczonej alternatywie, klon działa tak, jakby nie określono alternatywy .
git submodule add/update
” może teraz sklonować repozytoria podmodułów płytko! Zobacz moją odpowiedź poniżej