Das Verschieben von Änderungen der Git-Unterstruktur in das Upstream-Repository schlägt fehl

8

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:

  1. Initialisieren Sie beide Repos mit einem initialen Commit.
  2. Aktualisieren Sie den sub repo direkt (d. h. außerhalb von main ).
  3. Aktualisieren Sie den sub Repo von main repo.
  4. Teilen Sie die Änderungen in sub (mit git subtree split ) in einen separaten Zweig, den ich dann auschecke.
  5. Es wurde versucht, upstream zum sub repo zu schieben. Natürlich wird dieser Push abgelehnt, da er das direkte Update auf sub verlieren würde.
  6. Ziehen Sie die neue Änderung aus dem sub repo.
  7. Es wurde versucht, upstream zum 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:

%Vor%

Hier sind meine Fragen (endlich):

  1. Warum wird dieser Push abgelehnt?
  2. Was kann ich dagegen tun? (Wenn die Option git log die Antwort ist, wie kann ich sicher sein, dass ich nicht etwas destruktives mache?)
  3. Gibt es eine bessere Möglichkeit, das Modul --force zu verwenden, um dieses Problem zu vermeiden? (Hinweis: Ich bin nicht bereit Submodule zu verwenden.)
Jeff Terrell Ph.D. 19.04.2013, 20:16
quelle

1 Antwort

7

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?

    
Chronial 24.04.2013, 08:27
quelle

Tags und Links