Ich versuche sicherzustellen, dass die Subbäume von git für mich funktionieren, bevor ich sie in mein Projekt einfüge. Ich habe ein Problem beim Verschieben von Teilbaumänderungen in das Upstream-Repository festgestellt.
Das Setup besteht darin, dass ich zwei Repos, sub
und main
, habe und dass main
das sub
Repo als subtree
enthält.
Dann mache ich folgendes:
sub
repo direkt (d. h. außerhalb von main
). sub
Repo von main
repo. sub
(mit git subtree split
) in einen separaten Zweig, den ich dann auschecke. sub
repo zu schieben. Natürlich wird dieser Push abgelehnt, da er das direkte Update auf sub
verlieren würde. sub
repo. sub
repo zu schieben. Diesmal sollte es funktionieren, aber nicht. Ich habe ein Skript geschrieben, das dieses Problem kapselt. Ich verwende git Version 1.8.2.1 mit aktiviertem% co_de% Modul. Hier ist das Skript:
%Vor%Und hier ist die Ausgabe:
%Vor% Weitere subtree
Befehle (aus dem git pull
Zweig von split-branch
) sagen einfach "Bereits aktuell".
Die Sache, die mich wirklich verwirrt, ist, dass der main
-Befehl, so weit ich das sagen kann, dem Upstream-Repo wirklich einen Fast-Forward-Commit geben sollte, wie die folgende git push
-Ausgabe zeigt:
Hier sind meine Fragen (endlich):
git log
die Antwort ist, wie kann ich sicher sein, dass ich nicht etwas destruktives mache?) --force
zu verwenden, um dieses Problem zu vermeiden? (Hinweis: Ich bin nicht bereit Submodule zu verwenden.) Ihr Problem hängt nicht wirklich mit git subtree
zusammen. Du hast Probleme mit dem guten, alten, kniffligen Zeug. In diesem Fall git push
. Sie haben offensichtlich angenommen, dass die Syntax git pull
folgt. Das war ziemlich naiv - du benutzt Git;).
Sie push-out sagt Ihnen, was hier falsch ist:
%Vor% git pull sub-remote master
ruft den Kopf von sub-remote/master
ab und fügt ihn in den aktuell ausgecheckten Zweig ein, wie Sie es erwartet haben. Aber git push sub-remote master
verschiebt den Kopf des ausgecheckten Zweiges nicht in sub-remote/master
. Es drückt den Zweig mit dem gleichen Namen. Also in diesem Fall ist das master
, wie Sie in der obigen Ausgabe sehen können.
Von git help push
(Syntax ist git push <repsitory> <refspec>
):
Das Format eines
<refspec>
-Parameters ist ein optionales Plus +, gefolgt von der Quellenangabe<src>
, gefolgt von einem Doppelpunkt:
, gefolgt von der Zielangabe ref<dst>
. Es wird verwendet, um anzugeben, mit welchem<src>
-Objekt das<dst>
ref im entfernten Repository aktualisiert werden soll.Der
<dst>
gibt an, welcher Ref auf der Remote-Seite mit diesem Push aktualisiert wird. Beliebige Ausdrücke können hier nicht verwendet werden, ein tatsächlicher Verweis muss benannt werden. Wenn:<dst>
weggelassen wird, wird die gleiche Referenz wie<src>
aktualisiert.
Der Befehl, nach dem Sie suchen, lautet git push sub-remote splitbranch:master
. Aber warum verwenden Sie nicht git subtree push
an erster Stelle?
Tags und Links git git-push git-subtree push