Git: --force-with-lease und mehrere Pushurls

8

Ich habe einen Git Repo mit remote origin gespiegelt auf 3 Hosts.

%Vor%

Alles, überall ist commit A .

%Vor%

Ich Autor commit B und drücken Sie es. Jetzt sind alle bei Commit B .

%Vor%

Jetzt bemerke ich einen Fehler in diesem letzten Commit, also repariere ich ihn und stimme den Commit ab. Das bringt mich aus der Ferne mit den Remote (s).

%Vor%

Ich möchte blind vermeiden --force pushen, also verwende ich --force-with-lease , aber das scheitert auf eine interessante Weise.

%Vor%

Das Problem ist, dass --force-with-lease nur dann die Push-Funktion als sicher ansieht, wenn die Remote-Referenz dieselbe Commit-Anweisung wie die letzte Kommunikation mit ihr hat und meine lokale Aufzeichnung die sha1 dieser Commit-Operation in .git/refs/remotes/origin/master . Sobald der erste Mirror (GitHub) aktualisiert wird, aktualisiert Git die Remote-Referenz meines lokalen Rechners auf C , was dazu führt, dass die Push-Versuche zu GitLab und Bitbucket fehlschlagen, da wir jetzt erwarten, dass sie da sind commit C .

Ich möchte das herausfinden, also zwinge ich den GitHub-Spiegel zuerst, Commit für B zu machen.

%Vor%

Jetzt muss ich genauer sagen, welches Commit ich von den Fernbedienungen erwarte. Die Dokumentation besagt, dass Sie genau angeben können, welche Referenz aktualisiert werden soll und welche Commit Sie erwarten, dass sie aktuell bei --force-with-lease=<refname>:<expect> ist, also probiere ich das aus.

%Vor%

Klar mache ich etwas falsch. Vielleicht habe ich die <refname> falsch? Ich fühle mich so nahe. Was vermisse ich?

    
ivan 26.09.2016, 00:26
quelle

1 Antwort

3

Sehr interessante Frage! Ich habe es ausprobiert und erfolgreich reproduziert, was Sie mit Git 2.11.0 in diesen Test-Repos beschreiben:

Ich konnte erfolgreich mit --force-with-lease auf beide Remote-URLs mit folgendem Formular pushen:

%Vor%

Beachten Sie das + -Zeichen vor dem Zweignamen. Hier ist die Ausgabe:

%Vor%

Von der git-push (1) man-Seite:

  

Beachten Sie, dass --force für alle refs gilt, die verschoben werden. Daher wird push.default für die Übereinstimmung oder für mehrere Push-Ziele verwendet              configured with remote.*.push kann andere Refs als den aktuellen Zweig überschreiben (einschließlich lokaler Refs, die sich genau hinter ihrem Remote befinden)              Gegenstück). Um einen Push auf nur einen Zweig zu erzwingen, verwenden Sie einen + vor dem refspec, um ihn zu drücken (z. B. git push origin +master , um einen Push auf den master zu erzwingen.              Ast). Weitere Informationen finden Sie im Abschnitt <refspec>... .

    
Haralan Dobrev 14.12.2016, 22:07
quelle

Tags und Links