Wie robust sind Git-Commits, wenn der Strom ausfällt?

24

Eines Tages habe ich Git benutzt (ich benutze es immer noch) und der Strom ist während des Commits ausgefallen.

Als ich (eigentlich der Strom) zurückkam, war das Git Repo korrupt. Ich erinnere mich nicht an den genauen Namen, aber es war so etwas wie "ungültige Refs" oder so etwas.

Es ist leicht zu erraten, dass das Commit in der Mitte des Vorgangs unterbrochen wurde (ich habe ein Commit über IntelliJ durchgeführt, das die Indexadditionen automatisch durchführt). Es war auch leicht zu erraten, dass 'commit' nicht so ACID ist wie die DBMS-Operation mit dem gleichen Namen.

F : Gibt es eine Möglichkeit, sicherzustellen, dass Repo-Änderungsvorgänge die Atomizität berücksichtigen? dh wenn der Strom wieder ausfällt und ich mich verpflichte, möchte ich, dass mein Dateisystem nicht in einem beschädigten Zustand ist.

Luis Masuelli
quelle
10
UPS kaufen? .....
Robert Harvey
ein tägliches Backup machen?
Ratschenfreak
Es löst das Problem nicht - stellen Sie sich vor, das Git-Repo befindet sich auf einem Server und ich drücke von einem lokalen Repo aus, und während ich das Commit auf dem Server assimiliere, sinkt die Energie wieder. Das gleiche Problem, aber diesmal ohne menschliche Anwesenheit.
Luis Masuelli

Antworten:

10

Ich weiß nicht, ob es eine Möglichkeit gibt, Git-Commits dazu zu bringen, perfekt zeitgesteuerte Stromausfälle zu überstehen, aber möglicherweise können Sie Ihr Repository reparieren.

Git-Objekte sollten unveränderlich sein, daher sollten alle Ihre älteren Commits weiterhin gültig sein. Entsprechend dieser Antwort können Sie den Hash in .git/refs/heads/<branch-name>ändern, um den Kopf des Zweigs, an dem Sie gearbeitet haben, auf den vorherigen Commit zu ändern (Sie können sie in sehen .git/logs/HEAD).

Der Kommentar zu dieser Antwort besagt, dass diese Methode "das Repository immer noch in einem fehlerhaften Zustand belässt, dies jedoch die Wiederherstellung ermöglicht". Ich habe dies nicht getestet (keine Ahnung, wie Sie Ihre Situation replizieren sollen), aber ich gehe davon aus git gc, dass die Wiederherstellung über erfolgt, wodurch das beschädigte Commit gelöscht wird.

Idan Arye
quelle
6
"Keine Ahnung, wie Sie Ihre Situation reproduzieren können" Ziehen Sie den Stecker? ;)
yannis
3
@YannisRizos Vielleicht, wenn dies SVN war, aber Git-Commits sind zu schnell für menschliche Timing-Fähigkeiten ...
Idan Arye
5
Git ist Open Source, richtig? Um das Problem zu reproduzieren, erstellen Sie den Code, legen Sie einen Haltepunkt fest, bevor die Daten auf der Festplatte gespeichert werden, und ziehen Sie dann den Stecker.
John Saunders
10

Das Speichersystem von Git ist nicht transaktionell. Es besteht also die Möglichkeit, dass ein Hardwareproblem zu einem inkonsistenten Zustand führt. Andererseits ist Git auch sehr schnell, so dass Sie wirklich Pech haben müssen, von Problemen der Art „Stromausfall“ betroffen zu sein (systematische Probleme mit der Festplatte sind etwas anderes). Die Geschwindigkeit ergibt sich zum Teil gerade aus der Tatsache, dass es sich nicht um eine Transaktion handelt. Transaktionen sind sehr teuer, da sie auf die Bestätigung von der Festplatte warten müssen, dass die Daten geschrieben wurden. (Datenbanken unternehmen alle möglichen Dinge, um diese Kosten zu verschleiern, aber letztendlich zahlen sie immer noch den Preis. Einige der DVCS-Systeme der Konkurrenz sind transaktionell und auf derselben Hardware wie git ziemlich langsam .)

Im schlimmsten Fall - einem Totalausfall der Festplatte (was ich gesehen habe) - kann ein DVCS nur mithilfe der Tatsache wiederhergestellt werden, dass es verteilt ist. Wenn Sie Ihre Änderungen bis vor kurzem auf ein anderes System übertragen haben und diese auf viele verschiedene Hosts verteilt haben, müssen Sie für die Wiederherstellung nur einen dieser anderen Orte als Artefaktquelle verwenden, von dem Sie Ihre Zweige abrufen können ( auch wenn nur vorübergehend). Auf diese Weise ziehen Sie die Geschichte der interessanten Branchen zurück und können sehr schnell wieder arbeiten. Alles, was viele verteilte Kopien Ihres Repos auf einmal auslöscht, ist entweder eine Katastrophe, bei der Sie sich keine Gedanken über das anschließende Programmieren machen (denken Sie an einen starken Meteoriteneinschlag), oder es handelt sich um eine geradezu feindliche Aktion. (Versuchen Sie, solche Feinde nicht zu machen ...) Dies steht im Gegensatz zu nicht verteilten Systemen, bei denen der Verlust des zentralen Servers, auf dem sich alles befindet, ein schwerer Schlag ist.

Donal Fellows
quelle
5
Wenn Sie Ihre Filialen nicht pushen, keine Backups und keine USV erstellen, sind Sie selbst schuld, wenn Hardwareprobleme alles zunichte machen. Sie haben die Werkzeuge ...
Donal Fellows
1
Gibt es keine Möglichkeit oder kein Plugin, um sicherzustellen, dass Git-Operationen transaktionell sind? Wenn es eine solche Option oder ein solches Plugin gäbe, wäre es mir egal, ob sie (dh Operationen) langsamer sind. Zum Glück habe ich keine Hardwareprobleme. Leider geht die Energie in diesem Gebäude häufig aus (wenn ich sage, dass alle zwei Wochen eine eigene Präsenz entsteht), und ich codiere die ganze Zeit und habe keine USV. Zum Glück habe ich es auf Github entfernt (geklont / geschoben). Leider verliere ich etwas Zeit, wenn ich alles zurücksetzen und das Projekt erneut replizieren muss.
Luis Masuelli
2
Häufige Stromausfälle während der Arbeit bedeuten, dass Sie das Risiko einer Beschädigung des Dateisystems erhöhen, ohne die Hardware zu beschädigen. Ich frage mich, warum Sie die Idee einer USV nicht haben, die die meisten der beschriebenen Probleme löst und wahrscheinlich die beste Antwort ist.
Bart Silverstrim