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.
Antworten:
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.quelle
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.
quelle