Was bedeutet Atomic Commit für ein Versionierungssystem?

34

Einer der Gründe, warum Programmierer SVN gegenüber CVS bevorzugen, ist, dass erstere atomare Commits zulassen? Was bedeutet das ?

Aussenseiter
quelle
Dies könnte jemandem helfen , es erklärt, was es ist (es verwendet Git als Beispiel, kann aber möglicherweise für andere VCS angewendet werden)
Fagner Brack

Antworten:

69

Dies bedeutet, dass beim Festschreiben an das Versionskontrollsystem entweder alles eingegeben wird, was festgeschrieben werden soll, ODER nichts ausgeführt wird.

Wenn Sie in CVS versuchen, einen Commit durchzuführen, kann der Commit für mehrere Dateien erfolgreich sein und bei mehreren anderen fehlschlagen (weil sie geändert wurden). Dadurch befindet sich das Repository in einem unglücklichen Zustand, da die Hälfte Ihres Commits nicht vorhanden ist und Sie wahrscheinlich Dinge in einem Zustand belassen haben, in dem sie nicht kompiliert werden können oder noch schlimmer. Jetzt müssen Sie sich beeilen und alle Änderungen integrieren, damit Sie die anderen Dateien festschreiben können, bevor eine andere Person ein Update durchführen muss und die fehlerhaften Änderungen erhält.

In SVN geschieht dies nicht - SVN schreibt entweder alles fest, was Sie geändert haben, oder es schlägt den gesamten Änderungssatz fehl. Auf diese Weise bleibt das Repository aufgrund von Commit-Problemen niemals in einem defekten Zustand.

Michael Kohne
quelle
9
Ein wichtiges Ergebnis ist , dass , wenn Sie Check - out in einem bestimmten Zustand dann ist das Ergebnis immer ein konsistenter Zustand (sofern keine Benutzer-Fehler wie zu vergessen , eine Datei, natürlich zu begehen): Es ist entweder aus vor dem Festschreiben oder nach das begehen und nichts dazwischen. In CVS könnte es von "Mitte des Festschreibens" sein. Das SVN-Verhalten ist sehr gut für Dinge wie die kontinuierliche Integration. Bei CVS-Systemen erzwangen diese Systeme eine "Ruhephase", in der sie einen bestimmten Check-out nur dann verwendeten, wenn eine bestimmte Anzahl von Sekunden / Minuten nach dem Check-out keine weiteren Commits durchgeführt wurden.
Joachim Sauer
2
dunkle Erinnerungen an die Verwendung von CVS streicheln mich, während ich dies gelesen habe.
Shabunc
9
@Spoike - stimmt, aber das ist eine bewusste Handlung. In CVS können Probleme unverschuldet auftreten, während Sie in SVN daran arbeiten müssen.
Michael Kohne
3
@DanNeely - CVS legt sie einzeln fest. Aus diesem Grund erhalten Sie teilweise Festschreibungen - einige der Dateien werden durchlaufen und werden dann angehalten, wenn sie eine treffen, die (aufgrund eines Konflikts) nicht festgeschrieben werden kann. Es ist ein Ergebnis von CVS, das ursprünglich aus RCS heraus gewachsen ist, denke ich.
Michael Kohne
4
Beachten Sie auch, dass mit CVS, auch wenn Sie keinen Fehler feststellen und alles festgeschrieben wird, jemand mit einer schnelleren Verbindung seinen Quellbaum in der Mitte des Festschreibens aktualisieren und ihn in einem inkonsistenten Zustand belassen kann. (Und ich gehe davon aus, dass die Zeitstempel genauso verteilt sind, sodass der Versuch, den Baum ab einem Datum / einer Uhrzeit zu überprüfen, das / die in die Mitte eines Commits gefallen ist, zu ähnlichen Ergebnissen führen würde.)
SamB
15

Dies wird zB in Bye-bye CVS erklärt. Ich habe Artikel von Andy Lester umgewandelt worden :

Wenn ich versuche, ein Commit in Subversion durchzuführen, aber eine der Dateien einen Konflikt aufweist oder veraltet ist, wird keine der Dateien festgeschrieben. In CVS haben Sie einen halb-festgeschriebenen Satz von Dateien, die Sie JETZT reparieren müssen.

Die Tatsache, dass CVS den Programmierer zwingt, die Zusammenführung sofort zu korrigieren, ist so kontraproduktiv wie es nur geht. Im Vergleich dazu ist eine Option zum Verzögern / Abbrechen / sorgfältigen Zusammenführen von Änderungen ein wesentlicher Vorteil.


Weitere Vorteile von SVN gegenüber CVS, die im obigen Artikel erläutert wurden, sind:

  • Lokale Versionen von allem, was Sie tun
     
    Wenn Sie CVS Diff verwenden möchten, müssen Sie in der Lage sein, eine Verbindung zu Ihrem Repository herzustellen. Keine Netzverbindung, kein Unterschied. Subversion speichert lokale unberührte Kopien von dem, woran Sie arbeiten, so dass svn diff einwandfrei funktioniert. Willst du von vorne anfangen? svn revert funktioniert auch ohne verbindung.

  • Symbolische Namen von Revisionen
     
    HEAD ist der Name der Stammspitze in CVS, aber ich wollte schon immer in der Lage sein, "-r-1" zu sagen, wie ich es damals in PVCS-Tagen tun konnte. Mit CVS muss ich ein CVS-Protokoll über das, was ich gerade bearbeite, erstellen und dann eines subtrahieren. Das macht keinen Spaß. Mit Subversion kann ich svn diff -r PREV sagen.

  • Echte Statusberichte
     
    In CVS können Sie nur dann feststellen, ob etwas auf dem Server neuer ist, wenn Sie cvs update ausführen und hoffen, dass das, was ausfällt, keine Konflikte verursacht. Mit dem Befehl svn status erhalte ich einen echten Status, damit ich feststellen kann, ob Konflikte vorliegen, BEVOR ich ein Update vornehme.

  • Hilfreicher Umgang mit Zusammenführungskonflikten
     
    In CVS erhalten Sie bei Konflikten Konfliktmarkierungen in Ihrer Datei. In Subversion erhalten Sie Konfliktmarkierungen, PLUS eine Kopie Ihrer ursprünglichen Vor-Konflikt-Datei, PLUS die vom Server heruntergeladene Version und PLUS die Version, die Sie ursprünglich bearbeitet haben. Anschließend müssen Sie svn filename.txt explizit auflösen, um Subversion mitzuteilen, dass Sie das Problem behoben haben. Kein versehentliches Zurückschreiben in CVS mit noch vorhandenen Konfliktmarkierungen mehr.

Mücke
quelle
8

Dies bedeutet, dass alle Änderungen an allen Dateien in einer einzigen Transaktion festgeschrieben werden, sodass entweder alle erfolgreich sind oder keine.

Dies bedeutet, dass es weniger wahrscheinlich ist, dass Teilbearbeitungen im Repository eingecheckt werden, die dazu führen, dass Builds fehlschlagen. Man kann immer noch vergessen, alle relevanten Dateien einzuchecken, aber das ist eher ein Prozessproblem als ein Problem mit dem Versionssystem.

jk.
quelle
ist es dann nicht eine gute sache? Andernfalls würde ein teilweises Festschreiben dazu führen, dass Dateien nicht synchron sind.
Geek
2
ja es ist eine gute sache, partielle festschreibungen sind schlecht
jk.