Jak git submodule add -b
działa
Po dodaniu podmodułu z określoną gałęzią nowe sklonowane repozytorium (po git submodule update --init
) będzie w określonym zatwierdzeniu, a nie sama gałąź ( git status
w podmodule widnieje „Obecnie nie w żadnej gałęzi”).
Nie mogę znaleźć żadnych informacji na temat .gitmodules
lub .git/config
o oddziale modułem lub jakichkolwiek konkretnych popełnił, tak jak robi się to postać Git?
Czy można także podać tag zamiast gałęzi?
Używam wersji 1.6.5.2.
git
git-submodules
Ivan
źródło
źródło
Odpowiedzi:
Uwaga: Git 1.8.2 dodał możliwość śledzenia gałęzi. Zobacz niektóre odpowiedzi poniżej.
Trochę mylące jest przyzwyczajenie się do tego, ale submoduły nie znajdują się na gałęzi. Są, jak mówisz, tylko wskaźnikiem do konkretnego zatwierdzenia repozytorium submodułu.
Oznacza to, że gdy ktoś inny sprawdzi twoje repozytorium lub ściągnie kod i wykona aktualizację podmodułu git, podmoduł jest sprawdzany do tego konkretnego zatwierdzenia.
Jest to świetne w przypadku submodułu, który nie zmienia się często, ponieważ wtedy wszyscy w projekcie mogą mieć ten moduł w tym samym zatwierdzeniu.
Jeśli chcesz przenieść submoduł do określonego znacznika:
Następnie robi to inny programista, który chce zmienić katalog podmodułu na ten tag
git pull
zmiany, na które wskazuje ich katalog podmodułów.git submodule update
faktycznie łączy się z nowym kodem.źródło
cd my_submodule; git checkout [ref in submodule's repository
dajefatal: reference is not a tree: ...
. To tak, jakbygit
działało tylko w repozytorium nadrzędnym.git checkout v1.0
oddział lub tag?Chciałbym tutaj dodać odpowiedź, która jest tak naprawdę konglomeratem innych odpowiedzi, ale myślę, że może być bardziej kompletna.
Wiesz, że masz submoduł Git, kiedy masz te dwie rzeczy.
Twój
.gitmodules
wpis jest taki:W repozytorium Git masz obiekt submodułowy (w tym przykładzie o nazwie SubmoduleTestRepo). GitHub pokazuje je jako obiekty „submodule”. Lub wykonaj
git submodule status
z linii poleceń. Obiekty submodułu Git są specjalnymi rodzajami obiektów Git i przechowują informacje SHA dla określonego zatwierdzenia.Ilekroć to zrobisz
git submodule update
, zapełni twój podmoduł treścią z zatwierdzenia. Wie, gdzie znaleźć zatwierdzenie ze względu na informacje w.gitmodules
.Teraz
-b
wystarczy dodać jedną linię do.gitmodules
pliku. Tak więc, zgodnie z tym samym przykładem, wyglądałoby to tak:Obiekt submodułu nadal wskazuje na określony zatwierdzenie. Jedyną rzeczą, którą
-b
kupuje ta opcja, jest możliwość dodania--remote
flagi do aktualizacji zgodnie z odpowiedzią Vogelli:Zamiast zapełniać zawartość submodułu zatwierdzeniem wskazanym przez podmoduł, zastępuje zatwierdzenie najnowszym zatwierdzeniem w gałęzi master, a następnie zapełnia submoduł tym zatwierdzeniem. Można to zrobić w dwóch krokach przez odpowiedź djacobs7. Ponieważ zaktualizowałeś zatwierdzenie, na które wskazuje obiekt submodułu, musisz zatwierdzić zmieniony obiekt submodułu w swoim repozytorium Git.
git submodule add -b
nie jest jakimś magicznym sposobem na aktualizowanie wszystkiego w oddziale. Po prostu dodaje informacje o gałęzi w.gitmodules
pliku i daje opcję aktualizacji obiektu submodułu do najnowszego zatwierdzenia określonej gałęzi przed wypełnieniem go.źródło
.gitmodules
a po zrobieniu$ git submodule update --init --remote TestModule
wystąpił błąd mówiąc:fatal: Needed a single revision
iUnable to find current origin/TestTag revision in submodule path 'TestModule'
. Działa to z prawdziwą gałęzią. Czy w ogóle można podać znacznik.gitmodules
bez konieczności podawania dokładnego zatwierdzenia?.gitmodules
i pobiegłemgit submodule update
i nic się nie stało?(Wprowadzono Git 2.22, drugi kwartał 2019 r.
git submodule set-branch --branch aBranch -- <submodule_path>
)Zauważ, że jeśli masz istniejący podmoduł, który nie jest śledzi jeszcze gałęzi , to ( jeśli masz git 1.8.2+ ):
Upewnij się, że repozytorium nadrzędne wie, że jego podmoduł śledzi teraz gałąź:
Upewnij się, że twój moduł podrzędny znajduje się najpóźniej w tej gałęzi:
(gdzie „origin” to nazwa zdalnego repozytorium nadrzędnego z modułem został sklonowany z.
A
git remote -v
w środku, że modułem będzie go wyświetlić. Zazwyczaj jest to „pochodzenie”)Nie zapomnij zapisać nowego stanu swojego modułu podrzędnego w repozytorium nadrzędnym:
Późniejsza aktualizacja tego podmodułu będzie wymagać użycia
--remote
opcji:Zauważ, że za pomocą Git 2.10+ (III kwartał 2016) możesz użyć „
.
” jako nazwy oddziału:Ale, jak skomentowano przez LubosD
Oznacza to, że Git 2.23 (sierpień 2019 r.) Lub więcej.
Zobacz „ Mylić przez
git checkout
”Jeśli chcesz zaktualizować wszystkie swoje podmoduły według gałęzi:
Zauważ, że wynikiem, dla każdego zaktualizowanego podmodułu, prawie zawsze będzie odłączony HEAD , jak zauważa Dan Cameron swojej odpowiedzi .
( Clintm zauważa w komentarzach, że jeśli uruchomisz,
git submodule update --remote
a wynikowy sha1 będzie taki sam, jak gałąź, w której aktualnie znajduje się podmoduł, nic nie zrobi i pozostawi submoduł nadal „w tej gałęzi”, a nie w stanie odłączonej głowy. )Aby upewnić się, że gałąź jest faktycznie wyewidencjonowana (i to nie zmodyfikuje SHA1 specjalnego wpisu reprezentującego submoduł dla repozytorium nadrzędnego), sugeruje:
Każdy podmoduł nadal będzie odwoływał się do tego samego SHA1, ale jeśli dokonasz nowych zatwierdzeń, będziesz mógł je wypchnąć, ponieważ będą do nich odnosić gałęzie, które chcesz śledzić.
Po tym wypchnięciu w podmodule nie zapomnij wrócić do repozytorium nadrzędnego, dodać, zatwierdzić i wcisnąć nowy SHA1 dla tych zmodyfikowanych podmodułów.
Zwróć uwagę na użycie
$toplevel
, zalecanego w komentarzach przez Aleksandra Pogrebnyak .$toplevel
został wprowadzony w git1.7.2 w maju 2010 r .: commit f030c96 .dtmland
dodaje w komentarzach :To samo polecenie, ale łatwiejsze do odczytania:
umläute udoskonala komendę dtmland w uproszczonej wersji w komentarzach :
wiele linii:
Przed Git 2.26 (Q1 2020) pobieranie, które ma rekurencyjnie pobierać aktualizacje w podmodułach, nieuchronnie wytwarza ryzę wyjściową i trudno jest dostrzec komunikaty o błędach.
Nauczono tego polecenia, aby wyliczać submoduły, które miały błędy na końcu operacji .
Zobacz zatwierdzenie 0222540 (16 stycznia 2020 r.) Przez Emily Shaffer (
nasamuffin
) .(Połączone przez Junio C Hamano -
gitster
- w commit b5c71cc , 05 lutego 2020)źródło
foreach
Skrypt nie będzie zależeć na sztywno<path>
, jeśli zastąpi<path>
się$toplevel/
.foreach
Skrypt nie submodułów kasowych, które nie są następujących gałęzi. Jednak to polecenie daje oboje:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
git submodule update --remote --merge
lubgit submodule update --remote --rebase
. Te polecenia wykonują śledzenie zdalnej gałęzi.Git 1.8.2 dodał możliwość śledzenia gałęzi.
Zobacz także podmoduły Git
źródło
.gitmodules
plik?git submodule add -b tags/<sometag> <url>
której można zobaczyć jak liniabranch = tags/<sometag>
w.gitmodules
Przykład korzystania z podmodułów Git.
A to wygląda trochę tak:
Może to pomaga (chociaż używam tagu, a nie gałęzi)?
źródło
git reset --hard V3.1.2
? Po prostu dostaję „nic do zatwierdzenia”git status
w katalogu nadrzędnym.Z mojego doświadczenia wynika, że przełączanie gałęzi w superprojekcie lub przyszłych kasach nadal spowoduje odłączenie HEADs submodułów, niezależnie od tego, czy submoduł jest poprawnie dodany i śledzony (tj. Odpowiedzi @ djacobs7 i @Johnny Z).
I zamiast ręcznego sprawdzania poprawnej gałęzi ręcznie lub za pomocą skryptu można użyć podmodułu git foreach .
Spowoduje to sprawdzenie pliku konfiguracyjnego modułu podrzędnego pod kątem właściwości gałęzi i pobranie zestawu gałęzi.
git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'
źródło
Podmoduły Git są nieco dziwne - zawsze działają w trybie „odłączonej głowy” - nie aktualizują się do najnowszego zatwierdzenia w gałęzi, jak można się spodziewać.
Ma to jednak sens, gdy się nad tym zastanowić. Załóżmy, że tworzę repozytorium foo z paskiem podmodułu . Pcham moje zmiany i mówię, aby sprawdzić zatwierdzić a7402be z repozytorium foo .
Następnie wyobraź sobie, że ktoś dokonuje zmiany paska repozytorium dokonuje zanim będziesz mógł dokonać klonowania.
Po wyrejestrowaniu zatwierdzamy a7402be z repozytorium foo , oczekujesz tego samego kodu, który wypchnąłem. Właśnie dlatego submoduły nie aktualizują się, dopóki nie wydasz wyraźnego polecenia, a następnie nie wykonasz nowego zatwierdzenia.
Osobiście uważam, że podmoduły są najbardziej zagmatwaną częścią Git. Istnieje wiele miejsc, w których lepiej wyjaśnić submoduły niż ja. Polecam Pro Git autorstwa Scott Chacon.
źródło
git clone git://github.com/git/git.git
i wcisnąć tę funkcję ...? = DAby przełączyć gałąź dla submodułu (zakładając, że masz już submoduł jako część repozytorium):
cd
do rootowania twojego repozytorium zawierającego submoduły.gitmodules
do edycjipath = ...
iurl = ...
mówibranch = your-branch
: dla każdego podmodułu; zapisz plik.gitmodules
.$ git submodule update --remote
... to powinno pobrać najnowsze zatwierdzenia dla określonej gałęzi, dla każdego zmodyfikowanego podmodułu.
źródło
Mam to w moim pliku .gitconfig. Jest to nadal wersja robocza, ale na razie okazała się przydatna. Pomaga mi zawsze ponownie podłączyć submoduły do ich gałęzi.
źródło
Używamy Quacka aby pobrać określony moduł z innego repozytorium Git. Musimy pobrać kod bez całej bazy kodu dostarczonego repozytorium - potrzebujemy bardzo konkretnego modułu / pliku z tego ogromnego repozytorium i należy go aktualizować za każdym razem, gdy uruchamiamy aktualizację.
Osiągnęliśmy to w ten sposób:
Utwórz konfigurację
Przy powyższej konfiguracji tworzy jeden katalog z dostarczonego repozytorium GitHub, jak określono w pierwszej konfiguracji modułu, a drugi ma pobrać i utworzyć plik z danego repozytorium.
Inni programiści muszą tylko uruchomić
I pobiera kod z powyższych konfiguracji.
źródło
Jedynym efektem wyboru gałęzi dla submodułu jest to, że za każdym razem, gdy przekażesz
--remote
opcję wgit submodule update
wierszu poleceń, Git będzie sprawdzał w odłączonym trybie HEAD (jeśli--checkout
wybrano zachowanie domyślne ) ostatnie zatwierdzenie dla tej wybranej zdalnej gałęzi.Należy zachować szczególną ostrożność podczas korzystania z tej funkcji zdalnego śledzenia gałęzi dla submodułów Git, jeśli pracujesz z płytkimi klonami submodułów. Gałąź wybrana do tego celu w ustawieniach submodułu NIE JEST tą, która zostanie sklonowana podczas
git submodule update --remote
. Jeśli przekażesz również--depth
parametr i nie poinstruujesz Gita o tym, którą gałąź chcesz sklonować - a tak naprawdę nie możesz wgit submodule update
wierszu poleceń !! - zachowa się domyślnie, jak wyjaśniono wgit-clone(1)
dokumentacji,git clone --single-branch
gdy--branch
brakuje parametru jawnego , a zatem sklonuje tylko gałąź podstawową .Nic dziwnego, że po etapie klonowania wykonanym przez
git submodule update
polecenie, w końcu spróbuje sprawdzić najnowsze zatwierdzenie dla zdalnej gałęzi, którą wcześniej skonfigurowałeś dla podmodułu, a jeśli nie jest to podstawowa, nie jest ona częścią twój lokalny płytki klon i dlatego zawiedzieźródło
git submodule dodaj -b rozwijaj --name nazwa-gałęzi - https: //branch.git
źródło