Ich benutze Git-Submodule. Nach dem Abrufen von Änderungen vom Server wird mein Submodulkopf häufig vom Hauptzweig getrennt.
Warum passiert das?
Ich muss immer tun:
git branch
git checkout master
Wie kann ich sicherstellen, dass mein Submodul immer auf den Hauptzweig zeigt?
git
git-submodules
om471987
quelle
quelle
Antworten:
BEARBEITEN:
Eine gültige Lösung finden Sie unter @ Simba- Antwort
ALTE ANTWORT:
Persönlich hasse ich Antworten hier, die auf externe Links verweisen, die im Laufe der Zeit möglicherweise nicht mehr funktionieren, und überprüfe meine Antwort hier (es sei denn, die Frage ist doppelt vorhanden) - auf Fragen, die das Thema zwischen den Zeilen eines anderen Themas abdecken, aber insgesamt gleich sind: "Ich bin nicht antworten, lesen Sie die Dokumentation. "
Zurück zur Frage: Warum passiert das?
Situation, die Sie beschrieben haben
Dies ist ein häufiger Fall, wenn man Submodule nicht zu oft verwendet oder gerade mit Submodulen begonnen hat . Ich glaube, dass ich zu Recht sage, dass wir alle irgendwann dort waren, wo sich der KOPF unseres Submoduls löst.
Lösung: Stellen Sie sicher, dass Ihr Submodul den richtigen Zweig verfolgt
Lösung: Lassen Sie Ihr Submodul seinen Remote-Zweig verfolgen, indem Sie mit den folgenden beiden Befehlen neue Submodule hinzufügen.
<branch>
.In den meisten Fällen haben Sie Ihren DETACHED HEAD bereits behoben, da er mit einem der oben genannten Konfigurationsprobleme zusammenhängt.
Befestigen des abgenommenen Kopfes wenn
.update = checkout
Wenn Sie es jedoch geschafft haben, einige Änderungen lokal bereits für das Submodul vorzunehmen und diese festzuschreiben, haben Sie diese auf remote verschoben. Wenn Sie dann 'git checkout' ausgeführt haben, benachrichtigt Git Sie:
Die empfohlene Option zum Erstellen eines temporären Zweigs kann gut sein, und dann können Sie diese Zweige usw. einfach zusammenführen. Ich persönlich würde sie jedoch nur
git cherry-pick <hash>
in diesem Fall verwenden.Obwohl es noch einige weitere Fälle gibt, in denen Sie Ihre Submodule in den Status DETACHED HEAD versetzen können, hoffe ich, dass Sie jetzt ein bisschen mehr verstehen, wie Sie Ihren speziellen Fall debuggen können.
quelle
git submodule update --remote
. Bitte schauen Sie sich Simbas Antwort an. Ich denke, das sollte die richtige Antwort sein.Das Hinzufügen einer
branch
Option in.gitmodule
hängt NICHT mit dem getrennten Verhalten von Submodulen zusammen. Die alte Antwort von @mkungla ist falsch oder veraltet.Von
git submodule --help
, HEAD getrennt ist das Standardverhalten vongit submodule update --remote
.Erstens muss kein zu verfolgender Zweig angegeben werden .
origin/master
ist der Standardzweig, der verfolgt werden soll.Warum
Warum wird HEAD danach abgetrennt
update
? Dies wird durch das Standardverhalten der Modulaktualisierungcheckout
verursacht : .Um dieses seltsame Update-Verhalten zu erklären, müssen wir verstehen, wie Submodule funktionieren.
Zitat aus Beginn mit Submodulen in Buch Pro Git
Das Haupt-Repo verfolgt das Submodul mit seinem Status an einem bestimmten Punkt , der Commit-ID . Wenn Sie also Module aktualisieren, aktualisieren Sie die Festschreibungs-ID auf eine neue.
Wie
Wenn Sie möchten, dass das Submodul automatisch mit dem Remote-Zweig zusammengeführt wird, verwenden Sie
--merge
oder--rebase
.Alles was Sie tun müssen ist,
Empfohlener Alias:
Es gibt auch eine Option, um
--merge
oder--rebase
als Standardverhalten vongit submodule update
, indem Siesubmodule.$name.update
aufmerge
oderrebase
.Hier ist ein Beispiel zum Konfigurieren des Standardaktualisierungsverhaltens der Submodulaktualisierung in
.gitmodule
.Oder konfigurieren Sie es in der Befehlszeile,
Verweise
git submodule --help
quelle
git submodule update --remote --merge
, und es zieht das Submodul in einem getrennten Zustand herunter. Auch--rebase
mit dem gleichen Ergebnis versucht .cd
In das Submodul auschecken Sie das Submodul zu einem bestimmten Zweig mit ,git checkout master
.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Aber wie kann ich verhindern, dass Git sie immer ablöst? Das Festlegen von Konfigurationsoptionen für jedes Submodul ist keine Option!git submodule update --remote --merge
das Submodul nicht in einem getrennten HEAD-Zustand belassen, sonderngit submodule update
nach dem Bearbeiten meiner.gitmodule
Datei, wie Sie angegeben haben, das Submodul in einem getrennten HEAD-Zustand belassen.Ich habe es satt, mich immer zu lösen, also benutze ich einfach ein Shell-Skript, um es für alle meine Module zu erstellen. Ich gehe davon aus, dass alle Submodule auf Master sind: Hier ist das Skript:
Führen Sie es von Ihrem übergeordneten Modul aus
quelle
Schauen Sie sich meine Antwort hier an: Git-Submodule: Geben Sie einen Zweig / Tag an
Wenn Sie möchten, können Sie die Zeile "branch = master" manuell in Ihre .gitmodules-Datei einfügen. Lesen Sie den Link, um zu sehen, was ich meine.
BEARBEITEN: Um ein vorhandenes Submodulprojekt in einer Zweigstelle zu verfolgen, befolgen Sie stattdessen die Anweisungen von VonC hier:
Git-Submodule: Geben Sie einen Zweig / ein Tag an
quelle
branch = master" line into your .gitmodule
tatsächlich die vollständige Antwort dieses Problem für mich gelöst hat.Die andere Möglichkeit, Ihr Submodul zum Auschecken des Zweigs zu veranlassen, besteht darin, die
.gitmodules
Datei im Stammordner abzurufen und das Feldbranch
in der Modulkonfiguration wie folgt hinzuzufügen :branch = <branch-name-you-want-module-to-checkout>
quelle
branch = my_wanted_branch
. Abergit submodule update --remote
wenn man es laufen lässt, wird es immer noch als losgelöster Kopf ausgecheckt.Wie andere Leute gesagt haben, ist der Grund dafür, dass das übergeordnete Repo nur einen Verweis auf (den SHA1 von) einem bestimmten Commit im Submodul enthält - es weiß nichts über Zweige. So sollte es funktionieren: Der Zweig, der sich bei diesem Commit befand, hat sich möglicherweise vorwärts (oder rückwärts) bewegt, und wenn das übergeordnete Repo auf den Zweig verwiesen hat, kann er in diesem Fall leicht brechen.
Insbesondere wenn Sie sich sowohl im übergeordneten Repo als auch im Submodul aktiv entwickeln,
detached HEAD
kann der Status verwirrend und potenziell gefährlich sein. Wenn Sie im Submodul Commits ausführen, während es sich imdetached HEAD
Status befindet, baumeln diese und Sie können leicht Ihre Arbeit verlieren. (Dangling Commits können normalerweise mit gerettet werdengit reflog
, aber es ist viel besser, sie zuerst zu vermeiden.)Wenn Sie wie ich sind, sollten Sie die meiste Zeit, wenn sich im Submodul ein Zweig befindet, der auf das Auschecken des Commits verweist, diesen Zweig lieber auschecken, als sich beim gleichen Commit im getrennten HEAD-Status zu befinden. Sie können dies tun, indem Sie Ihrer
gitconfig
Datei den folgenden Alias hinzufügen :Nachdem
git submodule update
Sie dies getan haben, müssen Sie nur noch aufrufengit submodule-checkout-branch
, und jedes Submodul, das bei einem Commit ausgecheckt wird, auf das ein Zweig zeigt, wird diesen Zweig auschecken. Wenn Sie nicht oft mehrere lokale Zweige haben, die alle auf dasselbe Commit verweisen, wird dies normalerweise das tun, was Sie wollen. Wenn nicht, wird zumindest sichergestellt, dass alle von Ihnen getätigten Commits auf einen tatsächlichen Zweig übertragen werden, anstatt hängen zu bleiben.Wenn Sie git so eingerichtet haben, dass Submodule beim Auschecken automatisch aktualisiert werden (
git config --global submodule.recurse true
siehe diese Antwort ), können Sie einen Post-Checkout-Hook erstellen, der diesen Alias automatisch aufruft:Dann müssen Sie entweder nicht aufrufen
git submodule update
oder aktualisierengit submodule-checkout-branch
einfachgit checkout
alle Submodule auf ihre jeweiligen Commits und überprüfen die entsprechenden Zweige (falls vorhanden).quelle
Die einfachste Lösung ist:
Dann CD im Repo-Verzeichnis und:
Zusätzliche Lektüre: Best Practices für Git-Submodule .
quelle