Pytanie Dlaczego aktualizacja modułu git nie jest automatyczna przy kasie git?


Zmieniając gałęzie za pomocą git checkout, zakładam, że większość czasu chciałbyś zaktualizować swoje submoduły.

  • W jakiej sytuacji się znajdujesz nie chcesz zaktualizować submoduły po przełączeniu?
  • Co by się zepsuło, gdyby zostało to zrobione automatycznie przez kasę git?

Zaktualizowano na przykład:

  • Oddział A ma moduł podrzędny S przy 3852f1
  • Oddział B ma moduł podrzędny S na fd72d7

W oddziale A, check-out git B otrzyma roboczą kopię oddziału B z modułem S w 3852f1 (ze zmodyfikowanym S). Aktualizacja modułu git spowoduje pobranie zamówienia S na fd72d7.


60
2017-12-14 09:05


pochodzenie


Związane z: stackoverflow.com/questions/4611512/... - philfreo
zgadzam się z Tobą. Pracuję nad projektem z submodułami i po każdym ciągnięciu powinienem wykonać aktualizację modułu git, ale nie jest to konieczne w większości przypadków. jedyny powód, aby to zrobić - nie przegap, kiedy jeden z submodułów jest rzeczywiście aktualizowany. - Evgen Bodunov


Odpowiedzi:


Uważam, że submoduły nie aktualizujące się automatycznie są zgodne z celami rozwoju Git. Git jest przeznaczony do pracy w trybie rozproszonym i nie zakłada, że ​​jesteś w stanie połączyć się z repozytorium innym niż lokalne, chyba że wyraźnie mu to powiesz. Git, który nie będzie automatycznie odświeżał submodułu, byłby oczekiwanym zachowaniem, gdy pomyślałby o tym.

Mówiąc to, jeśli wiesz, że zawsze chcesz, aby te podmoduły były wciągane i wiesz, że nigdy nie oddzieliłbyś się od tych submodułów do innego lokalnego repozytorium, to nie powinien niczego przerwać, jeśli automatycznie odświeżysz je po kasy.


21
2017-12-14 09:13



Myślę, że Git Checkout powinien narzekać, jeśli zatwierdzenie dla modułu jest niedostępne, zamiast domyślnie pozostawić katalog roboczy w stanie niekonsekwentnym. Następnie możesz wykonać aktualizację modułu git, aby pobrać referencję commit. Znowu normalnie zatwierdzenie będzie dostępne, a realizacja transakcji będzie możliwa bez dostępu do sieci. Przyjmowanie odpowiedzi, ponieważ brzmi rozsądnie (ale mi się to nie podoba;) - serbaut
Po drugie, myślę, że git powinien spróbować zrobić moduł częściowy i zaktualizować początkową kasę oraz złożyć skargę i pokazać status, jeśli istnieje moduł, który nie został pobrany lokalnie za pierwszym razem. Po tym, jak już raz pojawi się potrzeba aktualizacji jawnej, ma to sens, ponieważ repozyty są różne, a moduł częściowy odwołuje się do konkretnego zatwierdzenia. Ale nawet w rozproszonym świecie, w którym być może był on niedostępny, najprawdopodobniej zechcesz go w pewnym momencie, a git powinien dać ci znać, że nigdy nie został wyciągnięty. - cclark
git fetch ma opcję automatycznego sprowadzać submodules, więc podobnie myślę, że kasy powinny mieć podobną opcję do automatycznie aktualizowanych / kasowych submodułów. - void.pointer
"Git nie automatycznie odświeżający submodułu byłby oczekiwanym zachowaniem, gdy pomyślałby o tym." - Nie rozumiem dlaczego. Rzeczywiście, nie widzę, aby którykolwiek z punktów w pierwszym akapicie miał jakiekolwiek znaczenie dla sprawy, czy Git powinien automatycznie próbować aktualizować submoduły podczas ciągnięcia. - Mark Amery
Git nie zakłada, że ​​masz dostęp do repozytorium, z którego się wyrejestrowałeś, kiedy chcesz wykonywać pracę w repozytorium. Zamiast tego, po sklonowaniu twoje repozytorium może działać całkowicie samodzielnie. Jeśli założeniem wyjściowym jest to, że łączysz się z repozytoriami zagranicznymi tylko wtedy, gdy ci o tym powiedziano, wtedy okazuje się, że Git nie powinien automatycznie odświeżać modułu, który starałem się przekazać. - Aaron


git checkout --recurse-submodules will został dodany do git 2.13

Jest to wspomniane w uwagach do wydania na: https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

submodule.recurse opcja została dodana do git 2.14

Ustawiony jako:

git config --global submodule.recurse true

man git-config mówi:

Określa, czy polecenia domyślnie przechodzą do modułów podrzędnych. Dotyczy to wszystkich poleceń, które mają --recurse-submodules opcja. Domyślnie false.


10
2018-05-08 18:13



submodule.recurse wydaje się działać zaczynając od git 2.14. - Kane
@Kane dziękuje za informację, zaktualizował odpowiedź. - Ciro Santilli 新疆改造中心 六四事件 法轮功