(Git 2.22, Q2 2019, wurde eingeführt git submodule set-branch --branch aBranch -- <submodule_path>
)
Beachten Sie Folgendes : Wenn Sie ein vorhandenes Submodul haben, das noch keinen Zweig verfolgt , dann ( wenn Sie Git 1.8.2+ haben ):
Stellen Sie sicher, dass das übergeordnete Repo weiß, dass sein Submodul jetzt einen Zweig verfolgt:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Stellen Sie sicher, dass sich Ihr Submodul tatsächlich auf dem neuesten Stand dieses Zweigs befindet:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(wobei 'origin' der Name des Upstream-Remote-Repos ist, von dem das Submodul geklont wurde.
Ein git remote -v
Innere dieses Submoduls zeigt es an. Normalerweise ist es 'origin')
Vergessen Sie nicht, den neuen Status Ihres Submoduls in Ihrem Eltern-Repo aufzuzeichnen:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
Bei der nachfolgenden Aktualisierung dieses Submoduls muss die folgende --remote
Option verwendet werden:
# 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
Beachten Sie, dass Sie mit Git 2.10+ (Q3 2016) ' .
' als Filialnamen verwenden können :
Der Name der Niederlassung wird wie submodule.<name>.branch
in .gitmodules
für aufgezeichnet update --remote
.
Ein spezieller Wert von .
gibt an, dass der Name des Zweigs im Submodul mit dem Namen des aktuellen Zweigs im aktuellen Repository identisch sein soll .
Aber wie von LubosD kommentiert
Mit git checkout
, wenn die Zweignamen zu folgen ist „ .
“, wird sie Ihre uncommitted Arbeit töten!
Verwenden Sie git switch
stattdessen.
Das bedeutet Git 2.23 (August 2019) oder mehr.
Siehe " Verwirrt vongit checkout
"
Wenn Sie alle Ihre Submodule nach einem Zweig aktualisieren möchten:
git submodule update --recursive --remote
Beachten Sie, dass das Ergebnis für jedes aktualisierte Submodul fast immer ein abgetrennter KOPF ist , wie Dan Cameron in seiner Antwort feststellt .
( Clintm merkt in den Kommentaren an, dass, wenn Sie ausführengit submodule update --remote
und das resultierende sha1 mit dem Zweig identisch ist, in dem sich das Submodul gerade befindet, es nichts tut und das Submodul immer noch "in diesem Zweig" und nicht im Status "Abgelöst" bleibt. )
Um sicherzustellen, dass der Zweig tatsächlich ausgecheckt ist (und dadurch die SHA1 des speziellen Eintrags, der das Submodul für das übergeordnete Repo darstellt, nicht geändert wird), schlägt er vor:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Jedes Submodul verweist weiterhin auf dasselbe SHA1. Wenn Sie jedoch neue Commits vornehmen, können Sie diese verschieben, da sie von dem Zweig referenziert werden, den das Submodul verfolgen soll.
Vergessen Sie nach diesem Push innerhalb eines Submoduls nicht, zum übergeordneten Repo zurückzukehren, den neuen SHA1 für diese modifizierten Submodule hinzuzufügen, festzuschreiben und zu pushen.
Beachten Sie die Verwendung von $toplevel
, empfohlen in den Kommentaren von Alexander Pogrebnyak .
$toplevel
wurde im Mai 2010 in git1.7.2 eingeführt: commit f030c96 .
Es enthält den absoluten Pfad des Verzeichnisses der obersten Ebene (wo .gitmodules
ist).
dtmland
fügt in den Kommentaren hinzu :
Das foreach-Skript kann Submodule, die keinem Zweig folgen, nicht auschecken.
Dieser Befehl bietet Ihnen jedoch beide:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
Der gleiche Befehl, aber leichter zu lesen:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute verfeinert den Befehl von dtmland mit einer vereinfachten Version in den Kommentaren :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
mehrere Zeilen:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Vor Git 2.26 (Q1 2020) erzeugt ein Abruf, der angewiesen wird, Aktualisierungen in Submodulen rekursiv abzurufen, zwangsläufig Unmengen von Ausgaben, und es wird schwierig, Fehlermeldungen zu erkennen.
Dem Befehl wurde beigebracht, Submodule aufzulisten, bei denen am Ende des Vorgangs Fehler aufgetreten sind .
Siehe Commit 0222540 (16. Januar 2020) von Emily Shaffer ( nasamuffin
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit b5c71cc , 05. Februar 2020)
fetch
: Fehler beim Abrufen des Submoduls hervorheben
Abgemeldet von: Emily Shaffer
In Fällen, in denen ein Submodul-Abruf fehlschlägt, wenn viele Submodule vorhanden sind, wird der Fehler des einzelnen fehlgeschlagenen Submodul-Abrufs unter Aktivität auf den anderen Submodulen vergraben, wenn mehr als ein Abruf zurückfiel fetch-by-oid
.
Rufen Sie einen Fehler zu spät auf, damit der Benutzer weiß, dass und wo etwas schief gelaufen ist .
Da fetch_finish()
nur synchron durch run_processes_parallel,
Mutexing aufgerufen wird, ist um nicht erforderlich submodules_with_errors
.