Ich habe einen Git Repo mit remote origin
gespiegelt auf 3 Hosts.
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.
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.
Klar mache ich etwas falsch. Vielleicht habe ich die <refname>
falsch? Ich fühle mich so nahe. Was vermisse ich?
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:
Beachten Sie das +
-Zeichen vor dem Zweignamen. Hier ist die Ausgabe:
Von der git-push (1)
man-Seite:
Beachten Sie, dass
--force
für alle refs gilt, die verschoben werden. Daher wirdpush.default
für die Übereinstimmung oder für mehrere Push-Ziele verwendet configured withremote.*.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 denmaster
zu erzwingen. Ast). Weitere Informationen finden Sie im Abschnitt<refspec>...
.
Tags und Links git