Używam podmodułów Git. Po pobraniu zmian z serwera wiele razy moja głowa podmodułu jest odłączana od gałęzi głównej.
Dlaczego tak się dzieje?
Muszę zawsze robić:
git branch
git checkout master
Jak mogę się upewnić, że mój moduł podrzędny zawsze wskazuje gałąź główną?
git
git-submodules
om471987
źródło
źródło
Odpowiedzi:
EDYTOWAĆ:
Prawidłowe rozwiązanie znajdziesz w @Simba Answer
STARA ODPOWIEDŹ:
Osobiście nienawidzę tutaj odpowiedzi kierujących do zewnętrznych linków, które z czasem mogą przestać działać i sprawdź moją odpowiedź tutaj (chyba że pytanie jest powtórzone) - kierując do pytania, które obejmuje temat między wierszami innego tematu, ale ogólnie jest równe: „Jestem nie odpowiadając, przeczytaj dokumentację. ”
Wróćmy więc do pytania: dlaczego tak się dzieje?
Sytuacja, którą opisałeś
Jest to częsty przypadek, gdy nie używa się podmodułów zbyt często lub dopiero zaczynamy z modułami podrzędnymi . Uważam, że mam rację stwierdzając, że wszyscy byliśmy w pewnym momencie, w którym nastąpiło odłączenie HEAD naszego submodułu .
Rozwiązanie: upewnij się, że podmoduł śledzi prawidłową gałąź
Rozwiązanie: spraw, aby moduł podrzędny śledził jego gałąź zdalną, dodając nowe moduły podrzędne za pomocą następujących dwóch poleceń.
<branch>
.W typowych przypadkach już naprawiłeś ODŁĄCZONEJ GŁOWICY, ponieważ było to związane z jednym z powyższych problemów z konfiguracją.
mocowanie ODŁĄCZONEJ GŁOWY, gdy
.update = checkout
Ale jeśli udało ci się wprowadzić pewne zmiany lokalnie już dla modułu podrzędnego i zatwierdziłeś, przekazałeś je do zdalnego, a następnie po wykonaniu polecenia „git checkout”, Git powiadamia:
Zalecana opcja tworzenia tymczasowej gałęzi może być dobra, a następnie możesz po prostu scalić te gałęzie itp. Jednak osobiście użyłbym tylko
git cherry-pick <hash>
w tym przypadku.Chociaż istnieje więcej przypadków, w których można wprowadzić moduły podrzędne w stan ODŁĄCZONA GŁOWA, mam nadzieję, że teraz rozumiesz nieco więcej, jak debugować konkretny przypadek.
źródło
git submodule update --remote
. Proszę spojrzeć na odpowiedź Simby, myślę, że to powinna być właściwa odpowiedź.Dodanie
branch
opcji w NIE.gitmodule
jest powiązane z jednorodzinnym zachowania submodules w ogóle. Stara odpowiedź od @mkungla jest nieprawidłowa lub nieaktualna.Od
git submodule --help
, odłączony HEAD jest domyślnym zachowaniem programugit submodule update --remote
.Po pierwsze, nie ma potrzeby określania gałęzi do śledzenia .
origin/master
jest domyślną gałęzią do śledzenia.Czemu
Dlaczego więc HEAD jest odłączany po
update
? Jest to spowodowane przez domyślne zachowanie aktualizacji modułu:checkout
.Aby wyjaśnić to dziwne zachowanie podczas aktualizacji, musimy zrozumieć, jak działają moduły podrzędne?
Cytat z książki „Rozpoczęcie od podmodułów” w książce Pro Git
Główne repozytorium śledzi podmoduł z jego stanem w określonym punkcie , identyfikatorem zatwierdzenia . Więc kiedy aktualizujesz moduły, aktualizujesz identyfikator zatwierdzenia na nowy.
W jaki sposób
Jeśli chcesz, aby moduł podrzędny został automatycznie połączony ze zdalną gałęzią, użyj
--merge
lub--rebase
.Wszystko, co musisz zrobić, to
Zalecany alias:
Istnieje również możliwość, aby zrobić
--merge
lub--rebase
jako domyślnego zachowaniagit submodule update
, przez ustawieniesubmodule.$name.update
sięmerge
lubrebase
.Oto przykład dotyczący konfigurowania domyślnego zachowania aktualizacji modułu podrzędnego w programie
.gitmodule
.Lub skonfiguruj go w linii poleceń,
Bibliografia
git submodule --help
źródło
git submodule update --remote --merge
i rozłącza moduł podrzędny w stanie odłączonym. Próbowałem również--rebase
z tym samym wynikiem.cd
do modułem, checkout submodule do oddziału szczególnego z,git checkout master
.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Ale jak mogę zapobiec ciągłemu odłączaniu ich przez git? Ustawianie opcji konfiguracyjnych dla każdego modułu podrzędnego nie wchodzi w grę!git submodule update --remote --merge
nie pozostawiło modułu podrzędnego w stanie odłączonego HEAD, ale działaniegit submodule update
po edycji mojego.gitmodule
pliku, jak wskazałeś, NIE pozostawiło podmodułu w stanie odłączonym HEAD.Mam dość tego, że zawsze się odłączam, więc po prostu używam skryptu powłoki, aby zbudować go dla wszystkich moich modułów. zakładam, że wszystkie podmoduły są na master: oto skrypt:
wykonaj go z modułu nadrzędnego
źródło
Sprawdź moją odpowiedź tutaj: Podmoduły Git: Określ gałąź / tag
Jeśli chcesz, możesz ręcznie dodać wiersz "branch = master" do pliku .gitmodules. Przeczytaj link, aby zobaczyć, co mam na myśli.
EDYCJA: Aby śledzić istniejący projekt podmodułu w oddziale, postępuj zgodnie z instrukcjami VonC tutaj:
Podmoduły Git: określ gałąź / tag
źródło
branch = master" line into your .gitmodule
w rzeczywistości pełna odpowiedź, rozwiązał ten problem za mnie.Innym sposobem, aby moduł podrzędny wyewidencjonował gałąź, jest przejście do
.gitmodules
pliku w folderze głównym i dodanie polabranch
w konfiguracji modułu w następujący sposób:branch = <branch-name-you-want-module-to-checkout>
źródło
branch = my_wanted_branch
. Ale bieganiegit submodule update --remote
nadal sprawdza się jako odłączona głowa.Jak powiedzieli inni ludzie, powodem tego jest to, że nadrzędne repozytorium zawiera tylko odniesienie do (SHA1) konkretnego zatwierdzenia w podmodułu - nie wie nic o gałęziach. Tak to powinno działać: gałąź, która była w tym zatwierdzeniu, mogła przesunąć się do przodu (lub do tyłu), a jeśli nadrzędne repozytorium odwoływało się do gałęzi, może łatwo się zepsuć, gdy tak się stanie.
Jednakże, szczególnie jeśli aktywnie rozwijasz się zarówno w nadrzędnym repozytorium, jak i w module podrzędnym,
detached HEAD
stan może być zagmatwany i potencjalnie niebezpieczny. Jeśli wykonasz zatwierdzenia w module podrzędnym, gdy jest on wdetached HEAD
stanie, zaczną one zawieszać się i możesz łatwo stracić pracę. (Wiszące zatwierdzenia można zwykle uratować za pomocągit reflog
, ale o wiele lepiej jest ich unikać.)Jeśli jesteś podobny do mnie, to przez większość czasu, jeśli w module podrzędnym znajduje się gałąź wskazująca na sprawdzanie zatwierdzenia, wolałbyś raczej sprawdzić tę gałąź niż być w stanie odłączonego HEAD w tym samym zatwierdzeniu. Możesz to zrobić, dodając następujący alias do swojego
gitconfig
pliku:Teraz, po wykonaniu tej czynności
git submodule update
, wystarczy wywołaćgit submodule-checkout-branch
, a każdy podmoduł, który jest pobrany w zatwierdzeniu, który ma gałąź wskazującą na niego, sprawdzi tę gałąź. Jeśli nie masz często wielu gałęzi lokalnych, z których wszystkie wskazują na to samo zatwierdzenie, to zwykle zrobi to, co chcesz; jeśli nie, to przynajmniej zapewni, że wszystkie wykonane przez Ciebie zatwierdzenia trafią do rzeczywistej gałęzi, zamiast pozostawać w zawieszeniu.Ponadto, jeśli skonfigurowałeś git, aby automatycznie aktualizował podmoduły przy kasie (używając
git config --global submodule.recurse true
, zobacz tę odpowiedź ), możesz zrobić haczyk po kasie, który automatycznie wywołuje ten alias:Wtedy nie musisz wywoływać żadnego z nich
git submodule update
lubgit submodule-checkout-branch
, po prostugit checkout
spowoduje to zaktualizowanie wszystkich podmodułów do odpowiednich zatwierdzeń i sprawdzenie odpowiednich gałęzi (jeśli istnieją).źródło
Najprostszym rozwiązaniem jest:
Następnie cd w katalogu repozytorium i:
Dodatkowa lektura: najlepsze praktyki git submodules .
źródło