バージョン管理システムのアトミックコミットとはどういう意味ですか?


34

プログラマがCVSよりもSVNを好む理由の1つは、前者がアトミックコミットを許可していることです。これは何を意味するのでしょうか ?


このかもしれないのヘルプ誰かが、それは(それが一例としてはgitを使用していますが、他のVCSのために適用することができるかもしれません)であるかを説明
Fagner Brackの

回答:


69

これは、バージョン管理システムにコミットすると、コミットしたいすべてが入ってくるか、何も入らないことを意味します。

CVSでは、コミットしようとすると、複数のファイルでコミットが成功し、他のいくつかのファイルで失敗する可能性があります(変更されているため)。これにより、コミットの半分が存在しないため、リポジトリが不幸な状態になります。また、コンパイルまたは悪化しない状態のままにしておく可能性があります。これで、他の誰かが更新する必要があり、壊れた変更セットを取得する前に他のファイルをコミットできるように、急いですべての変更を統合する必要があります。

SVNではこれは起こりません。SVNは変更したすべてをコミットするか、変更セット全体を失敗させます。したがって、コミットの問題が原因でリポジトリが破損した状態のままになることはありません。


9
この重要な結果は、あなたがあればということで、チェックアウト任意の状態で、結果は一貫性のある状態は、(例えば、もちろん、ファイルをコミットするのを忘れると、任意のユーザーのミスがなければ)常にある:それはどちらかから前にコミットまたはからコミットとその間に何もない。CVSでは、「コミットの途中」からの可能性があります。SVNの振る舞いは、継続的インテグレーションのようなものにとって非常に便利です。CVSシステムの場合、これらのシステムは、チェックアウト後の特定の秒数/分でコミットが行われない場合に、特定のチェックアウトのみを使用する「静かな期間」を実施していました。
ヨアヒムザウアー

2
私がこれを読んでいる間、CVSを使用した暗い記憶が私をstrokeでた。
-shabunc

9
@Spoike-本当ですが、それは意図的な行為です。CVSでは、あなた自身の過失によって問題が発生する可能性がありますが、SVNではそれに取り組む必要があります。
マイケルコーネ

3
@DanNeely-CVSはそれらを1つずつコミットします。そのため、部分的なコミットを取得します。一部のファイルは通過し、コミットできない(競合のため)ヒットすると停止します。それは、CVSがもともとRCSから成長した結果だと思います。
マイケルコーネ

4
また、CVSを使用すると、エラーが発生せずにすべてがコミットされたとしても、接続が高速な人はコミットの途中でソースツリーを更新し、一貫性のない状態のままにすることができます。(そして、タイムスタンプはちょうど同じように広がっているので、コミットの途中で落ちた日付/時刻のツリーをチェックアウトしようとすると、同様の結果になります。)
SamB

15

これは、たとえばBye-bye CVSで説明されています。私は Andy Lesterによって書かれた記事を覆されました:

Subversionでコミットしようとしても、ファイルの1つに競合があるか、最新ではない場合、どのファイルもコミットしません。CVSには、今すぐ修正しなければならない半分コミットされたファイルのセットがあります。

CVSがプログラマにマージをすぐに修正することを強制するという事実は、それが得るほど非生産的です。それと比較して、変更を遅延/キャンセル/慎重にマージするオプションは大きな利点です。


上記の記事で説明したCVSに対するSVNのその他の利点は次のとおりです。

  • 行うすべてのローカルバージョン
     
    cvs diffを使用する場合は、リポジトリに接続できる必要があります。ネット接続も差分もありません。Subversionは作業中のローカルコピーを保存するため、svn diffは問題なく動作します。やり直しますか?svn revertも接続されていません。

  • リビジョン
     
    HEADの記号名はCVSのトランクの先端の名前ですが、PVCSの時代に戻ったように、「-r-1」と常に言いたいと思っていました。CVSでは、編集しているものに対してcvsのログを作成し、1を差し引く必要があります。それは面白くない。Subversionでは、svn diff -r PREVと言えます。

  • 実際のステータスレポート
     
    CVSでは、サーバー上の何かが新しいかどうかを確認できる唯一の方法は、cvs updateを実行し、ダウンしたものが競合を引き起こさないことを期待することです。svn statusコマンドを使用すると、実際のステータスが取得されるため、更新を行う前に競合があるかどうかを確認できます。

  • マージの競合の
     
    便利な処理CVSでは、競合がある場合、ファイルに競合マーカーが表示されます。Subversionでは、競合マーカーに加えて、元の競合前のファイルのコピー、サーバーからダウンしたバージョン、および元々編集していたバージョンを取得します。次に、filename.txtを明示的にsvn resolveして、問題を解決したことをSubversionに通知する必要があります。競合マーカーがまだある状態で、誤ってCVSにコミットすることはもうありません。


8

これは、すべてのファイルに対するすべての変更が単一のトランザクションでコミットされるため、すべてが成功するか、まったく成功しないことを意味します。

これは、部分的な編集がリポジトリにチェックインされてビルドが失敗する可能性が低いことを意味します。関連するすべてのファイルをチェックインすることを忘れさせることもできますが、それはバージョン管理システムの問題というよりもプロセスの問題です。


それは良いことではありませんか?そうしないと、部分的なコミットの結果、ファイルが同期しなくなります。
オタク

2
はい、それは良いことです、部分的なコミットは悪いです
jk。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.