Czy można mieć płytkie podmoduły? Mam superprojekt z kilkoma modułami podrzędnymi, z których każdy ma długą historię, więc ciągnięcie całej tej historii jest niepotrzebnie duże.
Znalazłem tylko ten wątek bez odpowiedzi .
Czy powinienem po prostu zhakować git-submodule, aby to zaimplementować?
git
git-submodules
Mauricio Scheffer
źródło
źródło
git submodule add/update
” może teraz sklonować repozytoria podmodułów płytko! Zobacz moją odpowiedź poniżejOdpowiedzi:
Nowość w nadchodzącym git1.8.4 (lipiec 2013) :
(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 :
Oznacza to, że to działa:
Z:
atwyman dodaje w komentarzach :
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.)MVG wskazuje w komentarzach na popełnienie fb43e31 (git 2.9, luty 2016)
Aktualizacja sierpień 2016 (3 lata później)
Dzięki Git 2.10 (III kwartał 2016 r.) Będziesz w stanie to zrobić
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.)Jednak Ciro Santilli dodaje w komentarzach (i szczegółach w swojej odpowiedzi )
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.)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)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.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.)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.
Dokumentacja modułu podrzędnego konfiguracji zawiera teraz:
źródło
--depth
pokłócić;)uploadpack.allowReachableSHA1InWant
iuploadpack.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 scenariuszach, a mianowicie, jeśli zatwierdzenie jest również tagiem. Poczekajmy i zobaczmy..gitmodules
, czy ta--depth 1
opcja działa dla gałęzi, które nie śledzą dokładnie wzorca?Git 2.9.0 obsługuje podmoduły płytkie klonowanie bezpośrednio, więc teraz możesz po prostu zadzwonić:
źródło
Idąc za odpowiedzią Ryana, udało mi się wymyślić ten prosty skrypt, który iteruje przez wszystkie moduły podrzędne i płytko je klonuje:
źródło
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
za każdy podmodułCzytając git-submodule „source”, wygląda na to, że
git submodule add
może obsłużyć moduły podrzędne, które mają już swoje repozytoria. W tym wypadku...Będziesz chciał się upewnić, że wymagane zatwierdzenie znajduje się w repozytorium modułu podrzędnego, więc upewnij się, że ustawiłeś odpowiednią --depth.
Edycja: Możesz być w stanie uciec z wieloma ręcznymi klonami podmodułów, a następnie jedną aktualizacją:
źródło
Podsumowanie błędnego / nieoczekiwanego / denerwującego zachowania od Git 2.14.1
shallow = true
w.gitmodules
tylko wpływagit clone --recurse-submodules
jeżeliHEAD
z odległych punktów modułem do wymaganej popełnić, nawet jeśli cel popełnić jest wskazywany przez oddział, a nawet jeśli umieścićbranch = mybranch
na.gitmodules
jak dobrze.Lokalny skrypt testowy . To samo zachowanie na GitHub 2017-11, gdzie
HEAD
jest kontrolowane przez domyślne ustawienie repozytorium gałęzi:git clone --recurse-submodules --shallow-submodules
nie powiedzie się, jeśli nie jest ani zobowiązać się odwoływać przez oddział lub tagu z komunikatem:error: Server does not allow request for unadvertised object
.Lokalny skrypt testowy . To samo zachowanie na GitHub:
Zapytałem również na liście mailingowej: https://marc.info/?l=git&m=151863590026582&w=2 i odpowiedź brzmiała:
Test TODO:
allowReachableSHA1InWant
.źródło
git clone --recursive
którzy pobierają tylko to konkretne zatwierdzenie.Czy kanoniczne lokalizacje modułów podrzędnych są zdalne? Jeśli tak, czy możesz je raz sklonować? Innymi słowy, czy chcesz mieć płytkie klony tylko dlatego, że cierpisz z powodu zmarnowanej przepustowości częstych (re) klonów submodułów?
Jeśli chcesz, aby płytkie klony oszczędzały lokalną przestrzeń dyskową, odpowiedź Ryana Grahama wydaje się być dobrym rozwiązaniem. Ręcznie sklonuj repozytoria, aby były płytkie. Jeśli uważasz, że byłoby to przydatne, dostosuj się,
git submodule
aby je wspierać. Wyślij e-mail do listy z pytaniem o to (porady dotyczące implementacji, sugestie dotyczące interfejsu itp.). Moim zdaniem ludzie bardzo wspierają potencjalnych współpracowników, którzy szczerze chcą ulepszyć Git w konstruktywny sposób.Jeśli nie przeszkadza ci wykonanie jednego pełnego klonu każdego modułu podrzędnego (plus późniejsze pobieranie, aby były aktualne), możesz spróbować użyć
--reference
opcjigit submodule update
(jest w Git 1.6.4 i nowszych), aby odwołać się do lokalnych magazynów obiektów (np. utwórz--mirror
klony kanonicznych repozytoriów podmodułów, a następnie użyj--reference
w swoich modułach podrzędnych, aby wskazać te lokalne klony). Pamiętaj, aby przeczytać ogit clone --reference
/git clone --shared
przed użyciem--reference
. Jedynym prawdopodobnym problemem z odwoływaniem się do serwerów lustrzanych byłoby to, że kiedykolwiek pobierałyby aktualizacje bez szybkiego przewijania do przodu (chociaż można włączyć reflogs i rozszerzyć ich okna wygaśnięcia, aby pomóc zachować wszelkie porzucone zatwierdzenia, które mogą powodować problem). Dopóki nie powinieneś mieć żadnych problemówJeśli zdecydujesz się na coś takiego i jest jakakolwiek szansa, że możesz przenosić lokalne zatwierdzenia podmodułów w swoich drzewach roboczych, prawdopodobnie dobrym pomysłem byłoby utworzenie zautomatyzowanego systemu, który upewni się, że krytyczne obiekty, do których odwołują się wyewidencjonowane podmoduły, nie są pozostawione wiszące w repozytoriach lustrzanych (a jeśli jakieś zostaną znalezione, kopiuje je do repozytoriów, które ich potrzebują).
I, jak
git clone
mówi strona podręcznika, nie używaj,--reference
jeśli nie rozumiesz tych konsekwencji.Alternatywnie, zamiast tego
--reference
, możesz użyć klonów lustrzanych w połączeniu z domyślną funkcją łączenia twardegogit clone
, używając lokalnych serwerów lustrzanych jako źródła dla swoich podmodułów. W nowych klonach superprojektówgit submodule init
edytuj adresy URL podmodułów,.git/config
aby wskazywały na lokalne serwery lustrzane, a następnie wykonajgit submodule update
. Aby uzyskać dowiązania twarde, musisz ponownie klonować wszystkie istniejące wyewidencjonowane moduły podrzędne. Możesz zaoszczędzić przepustowość, pobierając tylko raz do serwerów lustrzanych, a następnie pobierając lokalnie z tych do wyewidencjonowanych podmodułów. Twarde łączenie pozwoliłoby zaoszczędzić miejsce na dysku (chociaż pobrania miałyby tendencję do gromadzenia się i duplikowania w wielu instancjach składnic obiektów wyewidencjonowanych podmodułów; można okresowo ponownie klonować wyewidencjonowane podmoduły z serwerów lustrzanych, aby odzyskać oszczędność miejsca na dysku zapewnianą przez łączenie twarde).źródło
Stworzyłem nieco inną wersję, gdy nie działa na krawędzi, co nie we wszystkich projektach. Standardowe dodatki do submodułów nie działały, podobnie jak powyższy skrypt. Więc dodałem wyszukiwanie skrótu dla ref tagu, a jeśli go nie ma, wraca do pełnego klonu.
źródło
Odniesienie do Jak sklonować repozytorium git z określoną wersją / zestawem zmian?
Napisałem prosty skrypt, który nie ma problemu, gdy odniesienie do modułu podrzędnego jest oddalone od wzorca
Ta instrukcja pobierze wskazaną wersję modułu podrzędnego.
Jest szybki, ale nie możesz zatwierdzić swojej edycji w module podrzędnym (musisz go pobrać przed https://stackoverflow.com/a/17937889/3156509 )
w pełni:
źródło
Płytkie klony podmodułu są idealne, ponieważ wykonują migawki w określonej wersji / zestawie zmian. Pobranie pliku ZIP ze strony internetowej jest łatwe, więc próbowałem znaleźć skrypt.
git submodule deinit --all -f
czyści drzewo podmodułów, co umożliwia wielokrotne użycie skryptu.git submodule
pobiera 40 znaków sha1, po których następuje ścieżka odpowiadająca temu samemu plikowi.gitmodules
. Używam perla do łączenia tych informacji, oddzielonych dwukropkiem, a następnie używam transformacji zmiennej, aby rozdzielić wartości namysha
imysub
.Są to klucze krytyczne, ponieważ potrzebujemy sha1 do pobrania i ścieżki do skorelowania
url
w .gitmodules.Biorąc pod uwagę typowy wpis podmodułu:
myurl
klawiszepath =
następnie patrzy 2 wiersze dalej, aby uzyskać wartość. Ta metoda może nie działać konsekwentnie i wymagać udoskonalenia. Url grep usuwa wszelkie pozostałe.git
odwołania do typów, dopasowując je do ostatniego/
i wszystkiego do a.
.mydir
jestmysub
minusem końcowym,/name
który oznaczałby katalog prowadzący do nazwy modułu podrzędnego.Dalej jest
wget
w formacie adresu URL archiwum zip do pobrania. Może się to zmienić w przyszłości.Rozpakuj plik, do
mydir
którego byłby podkatalog określony w ścieżce podmodułu. Wynikowy folder będzie ostatnim elementemurl
-sha1
.Sprawdź, czy podkatalog określony w ścieżce modułu podrzędnego istnieje i usuń go, aby umożliwić zmianę nazwy wyodrębnionego folderu.
mv
zmień nazwę wyodrębnionego folderu zawierającego nasz sha1 na prawidłową ścieżkę do modułu podrzędnego.Usuń pobrany plik zip.
Inicjalizacja modułu podrzędnego
Jest to bardziej dowód słuszności WIP niż rozwiązanie. Kiedy to działa, wynikiem jest płytki klon podmodułu przy określonym zestawie zmian.
Jeśli repozytorium przywróci moduł podrzędny do innego zatwierdzenia, uruchom ponownie skrypt w celu aktualizacji.
Jedyny przypadek, w którym taki skrypt byłby przydatny, jest przydatny w przypadku lokalnego tworzenia projektu źródłowego bez współpracy.
źródło