Hat Git einen "abgesicherten Modus", um das Umschreiben des Verlaufs zu verhindern?

11

Wenn Sie mit Git (und DVCS im Allgemeinen) ein wenig vertraut sind und Änderungen an der Umschreibung von Verlaufsdaten untersuchen, sind Sie sicher, wenn das Repository nur lokal ist. Wenn Sie jedoch mit Fernbedienungen arbeiten und dies versuchen, können Probleme auftreten solche Änderungen vorantreiben.

Eine Funktion, die ich erwarten würde, ist die Fähigkeit, einen "abgesicherten Modus" zu aktivieren, der mich grundsätzlich davon abhält, das zu tun, was ich nicht tun sollte ... Und was meine ich damit? Ich meine, Änderungen, die die Geschichte neu schreiben, für Dinge, die bereits einen Ursprung haben. Ich kann es nicht genau definieren, aber dies würde Fälle einschließen wie:

  • commit --amend wenn HEAD bereits gedrückt wurde
  • rebase einer nicht lokalen Niederlassung
  • reset eines Zweigs, der geschoben wurde

Dies sind Beispiele für Situationen, in denen der nächste wahrscheinlich pushfehlschlägt (weil es sich nicht um einen schnellen Vorlauf handelt, IIRC). Ich habe versehentlich etwas davon gemacht und musste den Zweig auf der Fernbedienung neu erstellen. Und ich hatte immer noch das Glück, dies schnell genug zu tun, damit niemand die Geschichte, die ich umgeschrieben habe, abrief.

Ich glaube, es ist möglich, diese Art von Änderungen zu identifizieren und den Benutzer bei Bedarf daran zu hindern, sie vorzunehmen. Gibt es dafür vielleicht eine Option?

Wenn dies nicht der Fall ist, lohnt es sich Ihrer Meinung nach, zu versuchen, es zu erstellen? Würden Sie versuchen, genau zu definieren, wie eine solche "gefährliche Veränderung" zu identifizieren ist?

Kos
quelle
In einer Arbeitsumgebung, in der das Festschreiben fehlerhafter Änderungen andere Programmierer betrifft, sollten Sie diese Aktionen wahrscheinlich nur ungern ausführen, es sei denn, Sie sind sicher, dass dies funktionieren sollte. Selbst dann sollten Sie sicherstellen, dass danach keine Probleme mehr bestehen. Stellen Sie sich vor, ich war vor ein paar Jahren in einem Team von vielen Programmierern, in denen man keine Bedenken hatte, eine Quelle zu begehen, die nicht kompiliert wurde ! Ich wollte ihn nach 3 Monaten erschießen.
Neil
Es erscheint vernünftig, dies an einem Hook auf dem Remote-Computer zu erkennen und die Änderungen dann abzulehnen.
Andrew T Finnell
Ich verstehe deine Frage nicht. Der Standardmodus ist sicher. Sie können nicht pushen, es sei denn, Sie geben an --force.
Let_Me_Be
Ich würde so etwas auch gerne sehen. Grundsätzlich möchte ich diesen Lernenden eine sicherere Version bieten, wahrscheinlich indem sie nur die Befehlszeile umbrechen und nur die Grundlagen offenlegen: Festschreiben, Ziehen, Drücken, einfache Dinge. Erzwingen Sie, dass sie für alles auf dieser Seite voll sind : git-scm.com/book/en/Git-Tools-Rewriting-History Git ist bereits etwas schwieriger zu erlernen als andere Tools, um über ein lokales und Remote-Repo nachzudenken - Es ist beängstigend, sich Sorgen zu machen, dass Sie eine Rebase anstelle eines Rollbacks durchführen könnten.
Chris Moschini

Antworten:

5

Dies sieht sehr genau aus, wenn nicht die gleiche Frage wie Strategie zum Verhindern oder Abfangen von Git History Rewrite

Um es zusammenzufassen, können Sie aktivieren

git config --system receive.denyNonFastforwards true

und

git config --system receive.denyDeletes true

Oder schreiben Sie einen Post-Receive-Hook, um alles abzulehnen, von dem Sie feststellen, dass es sich um ein Umschreiben handelt.

Andrew T Finnell
quelle
1
Ich glaube, das denyNonFastforwardsist die Standardeinstellung (?), Während dies denyDeletesnicht der Fall ist. Diese beiden sind nützlich, aber ich stelle mir eine clientseitige Lösung vor, die mich davon abhält, eine zu machen, commit --amendwenn ich sie nicht pushen könnte (weil HEAD bereits gepusht wurde).
Kos
Mit anderen Worten: Zusätzlich zu den Mechanismen, die es ermöglichen, eine Fernbedienung konsistent zu halten, möchte ich etwas, das es ermöglicht, einen Klon auch mit einer Fernbedienung "konsistent" zu halten.
Kos
@ Kos Sie können auch lokale Hooks erstellen
Andrew T Finnell
Gibt es eine Möglichkeit zu setzen , denyNonFastfowardsum truenur auf dem Master - Zweig? Ich möchte, dass meine Themenzweige neu basiert und erzwungen werden.
nnyby
2

Nein, denn es gehört zur Philosophie von git, Ihnen die volle Kraft zu geben und Sie diese Kraft so verwalten zu lassen, wie Sie es möchten.

Wenn Sie sich nicht an diese Philosophie halten, lohnt es sich vielleicht, zu Mercurial zu wechseln, da sie das Umschreiben der Geschichte ermöglichen, aber in begrenzter oder, um es klar auszudrücken, widerstrebender Weise, dass Sie der Meinung sind, dass dies keine gute Idee ist.

Klaim
quelle
2
Ich mache Fehler. Ein Mechanismus, bei dem ich explizit bestätigen muss, wann immer ich etwas Gefährliches tue, scheint dazu zu passen, "meine Macht so zu verwalten, wie ich es will". :-) (Auch Git macht das schon gelegentlich.)
Kos
2

AFAIK, die Art und Weise, wie Git diese Probleme löst, ist, dass wenn Sie eine solche Aktion anfordern, diese lokal ausgeführt wird, Sie jedoch darüber informiert werden, dass das, was Sie tun, unerwünschte Konsequenzen haben kann. Zu diesem Zeitpunkt haben Sie noch nichts gepusht, sodass Sie in der Lage sind, Ihr lokales Repository zu überprüfen und möglicherweise die gefährliche Änderung rückgängig zu machen, bevor Sie pushen. Sie müssen jedoch darauf achten, was Git Ihnen sagt, und Sie sollten besser vorsichtig sein, wenn Sie solche Fehler reparieren.

tdammers
quelle