Ich mache mir Sorgen, dass ich dieses raffinierte Feature vergessen könnte, wenn ich es das nächste Mal brauche.
Git 2.13 (Q2 2017) erklärt, warum es keinen "Schutz" gegen das Vergessen dieser Push-Option gibt, denn selbst wenn Sie sie auf der Ebene nicht vergessen git push, wird sie möglicherweise dennoch ignoriert.
Siehe Commit f17d642 (19. April 2017) von Ævar Arnfjörð Bjarmason ( avar) .
(Zusammengeführt von Junio C Hamano - gitster- in Commit 46bdfa3 , 26. April 2017)
push: Dokumentieren und Testen --force-with-leasemit mehreren Fernbedienungen
Dokumentieren und testen Sie Fälle, in denen zwei Fernbedienungen auf dieselbe URL verweisen und ein Abruf im Hintergrund und nachfolgende git push --force-with-leasenicht aktualisierte Referenzen, die wir nicht abgerufen haben, nicht blockieren sollten.
Einige Editoren wie Microsoft VSC verfügen über eine Funktion zum automatischen Abrufen im Hintergrund. Dadurch wird der von --force-with-lease& angebotene Schutz umgangen--force-with-lease=<refname> , wie in der hier hinzugefügten Dokumentation angegeben.
Die Dokumentation für dengit push Moment enthält also:
Allgemeiner Hinweis zur Sicherheit: Bereitstellung dieser Option ohne erwarteten Wert, dh als --force-with-leaseoder --force-with-lease=<refname>
sehr schlecht mit allem, was implizit git fetchauf der Fernbedienung ausgeführt wird, um im Hintergrund git fetch origin
verschoben zu werden, z. B. in Ihrem Repository in einem Cronjob.
Der Schutz, den es bietet, --forcestellt sicher, dass nachfolgende Änderungen, auf denen Ihre Arbeit nicht basiert, nicht überlastet werden. Dies wird jedoch trivial zunichte gemacht, wenn ein Hintergrundprozess Refs im Hintergrund aktualisiert. Wir haben nichts anderes als die Remote-Tracking-Informationen, die als Heuristik für Refs dienen sollen, die Sie voraussichtlich gesehen haben und die bereit sind, zu überfallen.
Wenn Ihr Editor oder ein anderes System git fetchim Hintergrund ausgeführt wird, können Sie dies abmildern, indem Sie einfach eine andere Fernbedienung einrichten:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Wenn der Hintergrundprozess ausgeführt wird, werden git fetch origindie Referenzen origin-pushnicht aktualisiert und daher Befehle wie:
git push --force-with-lease origin-push
Schlägt fehl, wenn Sie nicht manuell ausführen git fetch origin-push.
Diese Methode wird natürlich vollständig von etwas besiegt, das ausgeführt git fetch
--allwird. In diesem Fall müssten Sie sie entweder deaktivieren oder etwas Langwierigeres tun, wie:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
Das heißt, Sie erstellen ein baseTag für Versionen des Upstream-Codes, den Sie gesehen haben und der bereit ist, zu überschreiben, dann den Verlauf neu zu schreiben und schließlich Push-Änderungen zu erzwingen, masterwenn die Remote-Version noch verfügbar ist base, unabhängig davon, auf was Ihre lokale Version remotes/origin/masterin der aktualisiert wurde Hintergrund.
rmzurm -iIhrer Bashrc; Sie werden eines Tages eine wichtige Datei auf einem Server vergessen und löschen. Mit Ihrem eigenen Alias zu gehen hat dieses Problem nicht :)