(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łąź:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Upewnij się, że twój moduł podrzędny znajduje się najpóźniej w tej gałęzi:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(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:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
Późniejsza aktualizacja tego podmodułu będzie wymagać użycia --remote
opcji:
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Zauważ, że za pomocą Git 2.10+ (III kwartał 2016) możesz użyć „ .
” jako nazwy oddziału:
Nazwa oddziału jest rejestrowana jako submodule.<name>.branch
w .gitmodules
do update --remote
.
Specjalna wartość.
jest używana do wskazania, że nazwa gałęzi w submodule powinna być taka sama jak bieżąca gałąź w bieżącym repozytorium .
Ale, jak skomentowano przez LubosD
Dzięki git checkout
, jeśli następująca nazwa oddziału to „ .
”, zabije to twoją nieprzyjętą pracę!
Posługiwać sięgit switch
zamiast tego.
Oznacza to, że Git 2.23 (sierpień 2019 r.) Lub więcej.
Zobacz „ Mylić przezgit checkout
”
Jeśli chcesz zaktualizować wszystkie swoje podmoduły według gałęzi:
git submodule update --recursive --remote
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:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
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 .
zawiera bezwzględną ścieżkę do katalogu najwyższego poziomu (gdzie .gitmodules
jest).
dtmland
dodaje w komentarzach :
Skrypt foreach nie pobierze podmodułów, które nie podążają za gałęzią.
Jednak to polecenie daje obie możliwości:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
To samo polecenie, ale łatwiejsze do odczytania:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute udoskonala komendę dtmland w uproszczonej wersji w komentarzach :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
wiele linii:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
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)
fetch
: podkreśl niepowodzenie podczas pobierania podmodułu
Podpisano: Emily Shaffer
W przypadkach, gdy pobieranie podmodułu kończy się niepowodzeniem, gdy jest wiele podmodułów, błąd z pojedynczego nieudanego pobierania podmodułu jest zakopany pod działaniem innych podmodułów, jeśli więcej niż jedno pobranie się powróciło fetch-by-oid
.
Wywołaj awarię późno, aby użytkownik wiedział, że coś poszło nie tak i gdzie .
Ponieważ fetch_finish()
jest wywoływany tylko synchronicznie przez run_processes_parallel,
muteksowanie, nie jest wymagane w pobliżu submodules_with_errors
.