Nie jestem pewien, co oznacza (z dokumentacji aktualizacji modułu podrzędnego Git ):
... sprawi, że podmoduły HEAD zostaną odłączone, chyba że
--rebase
lub--merge
zostanie określony ...
Jak --rebase
/ --merge
zmienia rzeczy?
Moim głównym przykładem użycia jest posiadanie kilku centralnych repozytoriów, które za pośrednictwem submodułów będę osadzał w innych repozytoriach. Chciałbym móc ulepszyć te centralne repozytoria, albo bezpośrednio w ich oryginalnej lokalizacji, albo z ich wbudowanych repozytoriów (tych, które używają ich przez submoduł).
- Czy w ramach tych podmodułów mogę tworzyć gałęzie / modyfikacje i używać push / pull tak jak w zwykłych repozytoriach, czy też jest coś, na co należy uważać?
- Jak mogę przejść do zatwierdzonego modułu podrzędnego z powiedzmy (otagowany) 1.0 do 1.1 (nawet jeśli nagłówek oryginalnego repozytorium ma już wersję 2.0) lub wybrać, który z zatwierdzonych gałęzi w ogóle jest używany?
git
git-submodules
Głęboki błękit
źródło
źródło
Odpowiedzi:
Ta strona GitPro ładnie podsumowuje konsekwencje aktualizacji podmodułu git
Uwaga marzec 2013:
Jak wspomniano w „ Śledzenie podmodułu git najnowsze ”, teraz podmoduł (git1.8.2) może śledzić gałąź.
Zobacz „
git submodule update --remote
vsgit pull
”.MindTooth „s odpowiedź zilustrować ręczną aktualizację (bez lokalnej konfiguracji):
W obu przypadkach spowoduje to zmianę odniesień do podmodułów ( gitlink , specjalny wpis w nadrzędnym indeksie repo ) i konieczne będzie dodanie, zatwierdzenie i przekazanie wspomnianych referencji z głównego repozytorium.
Następnym razem, gdy sklonujesz to repozytorium nadrzędne, zapełni ono podmoduły, aby odzwierciedlić te nowe odwołania SHA1.
Pozostała część tej odpowiedzi szczegółowo opisuje klasyczną funkcję submodułu (odniesienie do ustalonego zatwierdzenia, które jest najważniejszym punktem koncepcji submodułu).
Aby odpowiedzieć na twoje pytania:
Możesz utworzyć gałąź i modyfikacje push.
OSTRZEŻENIE (z samouczka Git Submodule ): Zawsze publikuj (wypychaj) zmianę podmodułu przed publikowaniem (wypychaj) zmiany do superprojektu, który się do niej odwołuje. Jeśli zapomnisz opublikować zmianę submodułu, inni nie będą mogli sklonować repozytorium.
Strona „ Zrozumienie submodułów ” może pomóc
Te razem triangulują konkretną wersję konkretnego repozytorium, która jest wyewidencjonowana w określonej lokalizacji w twoim projekcie.
Ze strony podmodułu git
100% poprawność: nie można modyfikować submodułu, odwołać się tylko do jednego z jego zatwierdzeń.
Dlatego modyfikując submoduł z głównego projektu, wykonujesz:
Podmoduł umożliwia opracowanie podejścia opartego na komponentach , gdzie główny projekt odnosi się tylko do określonych zatwierdzeń innych komponentów (tutaj „inne repozytoria Git zadeklarowane jako podmoduły”).
Podmoduł jest znacznikiem (zatwierdzeniem) w innym repozytorium Git, które nie jest związane głównym cyklem rozwoju projektu: to („inne” repozytorium Git) może ewoluować niezależnie.
Do głównego projektu należy wybranie z tego drugiego repozytorium dowolnego potrzebnego zatwierdzenia.
Jeśli jednak chcesz, dla wygody , zmodyfikować jedną z tych podmodułów bezpośrednio z głównego projektu, Git pozwala to zrobić, pod warunkiem, że najpierw opublikujesz te modyfikacje podmodułu w oryginalnym repozytorium Git, a następnie zatwierdzisz swój główny projekt, odnosząc się do nowa wersja wspomnianego modułem.
Ale główna idea pozostaje: odniesienie do konkretnych komponentów, które:
Lista konkretnych zatwierdzeń, do których się odwołujesz w głównym projekcie, określa twoją konfigurację (na tym właśnie polega Zarządzanie konfiguracją , englobowanie zwykłego systemu kontroli wersji )
Jeśli komponent można naprawdę opracować w tym samym czasie, co główny projekt (ponieważ każda modyfikacja w głównym projekcie wymagałaby modyfikacji podkatalogu i odwrotnie), byłby to już „podmoduł”, ale scalanie poddrzewa (przedstawione również w pytaniu Przenoszenie starszej bazy kodu z CVS do repozytorium rozproszonego ), łącząc ze sobą historię dwóch repozytoriów Git.
Czy to pomaga zrozumieć prawdziwą naturę submodułów Git?
źródło
svn:externals
.git submodule foreach
Aby zaktualizować każdy podmoduł, możesz wywołać następujące polecenie (w katalogu głównym repozytorium):
Możesz usunąć opcję -q , aby śledzić cały proces.
źródło
git submodule update --init --recursive
z katalogu głównego, pobierze je wszystkie rekurencyjnie i zainicjuje je, jeśli jeszcze nie są.git submodule update --rebase --remote
Aby rozwiązać opcję
--rebase
vs.--merge
Powiedzmy, że masz super repozytorium A i submoduł B i chcesz popracować w submodule B. Odrobiłeś pracę domową i wiesz, że po wywołaniu
git submodule update
jesteś w stanie bez HEAD, więc trudno jest wrócić do wszelkich zatwierdzeń, które wykonasz w tym momencie. Rozpocząłeś pracę nad nowym oddziałem w podmodule B
Tymczasem ktoś inny w projekcie A zdecydował, że najnowsza i najlepsza wersja B jest naprawdę tym, na co zasługuje A. Z przyzwyczajenia scalasz ostatnie zmiany i aktualizujesz swoje podmoduły.
Och nie! Znowu jesteś w stanie bezgłowym, prawdopodobnie dlatego, że B wskazuje teraz SHA związane z nową wskazówką B lub innym zatwierdzeniem. Gdybyś tylko miał:
Teraz ten najlepszy pomysł na B został oparty na nowym zatwierdzeniu, a co ważniejsze, nadal jesteś w swojej gałęzi rozwoju dla B, a nie w stanie bezgłowym!
(
--merge
Scalą zmiany z beforeUpdateSHA do afterUpdateSHA w działający oddział, w przeciwieństwie do przeniesienia zmian na afterUpdateSHA.)źródło
Git 1.8.2 oferuje nową opcję
--remote
, która umożliwi dokładnie takie zachowanie. Bieganiepobierze najnowsze zmiany z wyższego poziomu w każdym podmodule, wyłączy je i sprawdzi najnowszą wersję tego podmodułu. Zgodnie z dokumentacją :
Jest to równoważne z uruchomieniem
git pull
w każdym podmodule, co jest generalnie dokładnie tym, czego chcesz.(Zostało to skopiowane z tej odpowiedzi ).
źródło