52

Subversion book を読んだところ、Subversion は個々のファイルを保存するのではなく、ディスク容量を最小限に抑えるためにデルタのみを保存することが明らかでした。Subversion はバイナリ ファイルでも同じことを行います (これは以前は CVS の大きな弱点でした)。

しかし、私は正確なメカニズムを理解していません。ファイルをコミットするとどうなりますか?

  1. Subversion は差分のみを保存します (そして既に古いバージョンを持っています)
  2. Subversion は以前のバージョンを削除し、新しいファイルをそのまま保存し、必要に応じて古いバージョンを「再作成」するために逆差分を作成します。
  3. 私が考えていなかった他の何か。

最初のケースが最も論理的に見えるかもしれません。しかし、これは別の問題を提起します。Subversion リポジトリに 1000 件のコミットを含むファイルがあり、新しい開発者がクリーン コピーをチェックアウトした場合、Subversion は元のバージョンを取得し (初期インポート)、結果を返す前に 1000 の差分を適用する必要があります。これは正しいです?最新バージョンも保持されるファイルのキャッシュのようなものはありますか?

基本的に、svn リポジトリの内部に関する情報はどこで見つけることができますか?

更新:どうやら、Subversion のバックエンドがこれに大きな役割を果たしているようです。現在または執筆中、FSFS はオプション 1 を使用し、BDB はオプション 2 を使用します。ありがとう msemack!

4

5 に答える 5

15

Subversion のリポジトリ形式は完全に内部的なものであるため、あるリビジョンから次のリビジョンへと表現を自由に変更できます。現在のリビジョンでは通常、リバース デルタ (オプション 2) が保存されますが、完全なスナップショットも定期的に保存されるため、結果を返す前に 1000 の差分を解決する必要はありません。

Subversion 1.6 のリリース ノートには、ファイル システム ストレージの改善に関するセクションがあり、これに関するいくつかのノートと、他のソースへのリンクがあります。Subversion のデータ ストレージの詳細は複雑であり、変更される可能性があるということだけは言っておきます。

Subversion ソース ツリーには、Subversion でのスキップ デルタの使用について説明した設計ドキュメントもあります。通常、/notes/ディレクトリには、Subversion の内部に関するいくつかの役立つドキュメントが含まれています。

于 2010-02-25T09:21:01.843 に答える
9

Subversion Designドキュメント(ただし、かなり古いものです)から、次の情報を入手できます。

他の多くのリビジョン管理システムと同様に、Subversionは変更を相違点として保存します。ノードの完全なコピーは作成されません。代わりに、最新のリビジョンをフルテキストとして保存し、以前のリビジョンを一連の逆差分として保存します(ここでは、「diff」という単語は大まかに使用されます。ファイルの場合はvdeltaを意味し、ディレクトリの場合は変更を表す形式を意味します。ディレクトリ)。

それ以来、それは変わっていないと思います。

また、バブルアップ方式も参照してください。

于 2010-02-25T09:24:49.377 に答える
9

次のリンクは、fsfs アーキテクチャを理解するのに役立つと思います

http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_fs_fs/structure

于 2011-10-06T13:33:26.167 に答える
3

通常のFSFS仕様が役立つ場合があります。

または、Berkeley DB を使用する場合仕様は次のとおりです。

FSFS は逆デルタを使用して変更を保存し、スキップデルタを使用して一部のアクションを高速化します (すべてを正しく理解していれば)。

于 2010-02-25T09:47:36.553 に答える
1

変更をコミットするたびに、リポジトリはそのリポジトリツリー全体の新しいリビジョンを保存し、新しいツリーに新しいリビジョン番号のラベルを付けます。もちろん、変更した部分を除いて、ツリーのほとんどは以前のリビジョンと同じです。

新しいリビジョン番号は、そのリビジョンでアクセスしたファイルやディレクトリだけでなく、新しいツリー全体に適用される連続したラベルです。ただし、口語的には、リビジョン番号は、そのリビジョンでコミットされた変更を参照するために使用されます。たとえば、「r588の変更」(「r588」は「リビジョン588」の省略形)は、実際には「リポジトリツリー587と588の違い」を意味します。言い換えると、「ツリー587を変更してツリー588を生成する」という意味です。 "。

ご覧ください:Subversion FAQ

于 2010-02-25T09:25:27.333 に答える