私はSubversionの本を読みましたが、ディスクスペースを最小限に抑えるために、Subversionは個々のファイルを保存せず、デルタのみを保存することは明らかです。 Subversionはバイナリファイルでも同じことを行います(これは以前はCVSの大きな弱点でした)。
しかし、私は正確なメカニズムを理解していません。ファイルをコミットするとどうなりますか?
最初のケースが最も論理的に見えるかもしれません。しかし、これは別の問題を提起します。 Subversionリポジトリに1000コミットのファイルがあり、新しい開発者がクリーンコピーをチェックアウトすると、Subversionは元のバージョンを取得し(初期インポート)、結果を返す前にこれに1000の差分を適用する必要があります。これは正しいです?最新バージョンも保存されているファイルに何らかのキャッシュがありますか?
基本的にsvnリポジトリ内部の情報はどこで見つけることができますか?
更新:どうやらSubversionのバックエンドがこれで大きな役割を果たしているようです。現時点では、FSFSはオプション1を使用し、BDBはオプション2を使用しています。ありがとうございます。msemack!
Subversionのリポジトリ形式は完全に内部であるため、1つのリビジョンから次のリビジョンに表現を自由に変更できます。現在のリビジョンは通常、リバースデルタ(オプション2)を格納しますが、結果を返す前に1000の差分を解決する必要がないように、完全なスナップショットも定期的に格納すると考えています。
Subversion 1.6リリースノートには ファイルシステムストレージの改善 に関するセクションがあり、これに関するいくつかのノートと他のソースへのリンクがあります。 Subversionデータストレージの詳細は複雑であり、変更される可能性があると言えば十分です。
Subversionでデルタをスキップ の使用法を説明するデザインドキュメントもSubversionソースツリーにあります。一般的に、 / notes / ディレクトリには、Subversion内部に関するいくつかの有用なドキュメントが含まれています。
私は次のリンクがfsfsアーキテクチャを理解するのに役立つと信じています
http://svn.Apache.org/repos/asf/Subversion/trunk/Subversion/libsvn_fs_fs/structure
Subversion Design ドキュメントから(かなり古いですが)これを取得できます:
他の多くのリビジョン管理システムと同様に、Subversionは変更を差分として保存します。ノードの完全なコピーは作成しません。代わりに、最新のリビジョンを全文として保存し、以前のリビジョンを一連の逆diffとして保存します(ここでは「diff」という単語を大まかに使用します。ファイルの場合はvdelta、ディレクトリの場合は、ディレクトリ)。
それ以降は変わっていないと思います。
また、 Bubble-Up Method も参照してください。
通常の [〜#〜] fsfs [〜#〜] の指定が役立つ場合があります。
または、Berkeley DBを使用する場合、 here's の仕様。
すべてを正しく理解していれば、FSFSは逆デルタを使用して変更を保存し、 skip-deltas を使用して一部のアクションを高速化します。
変更をコミットするたびに、リポジトリはそのリポジトリツリー全体の新しいリビジョンを保存し、新しいツリーに新しいリビジョン番号のラベルを付けます。もちろん、変更した部分を除いて、ツリーのほとんどは以前のリビジョンと同じです。
新しいリビジョン番号は、そのリビジョンで触れたファイルやディレクトリだけでなく、新しいツリー全体に適用される連続したラベルです。ただし、口語的には、そのリビジョンでコミットされた変更を参照するためにリビジョン番号が使用されます。たとえば、「r588の変更」(「r588」は「リビジョン588」の略です)は、実際には「リポジトリツリー587と588の違い」を意味します。 「。
ご覧ください: Subversion FAQ