4

リポジトリ内のさまざまなファイルのディスク容量要件を分析するのに役立つツールを探しています。

私のリポジトリには、いくつかのリビジョンを持つより大きなバイナリがあります。

だから私は、例えば、リポジトリで単一のバイナリのこのすべてのリビジョンが使用するスペースの大きさに興味を持っています。svnの削除がどれほど効率的に機能するかわからないため、この情報は「list」コマンドでは簡単に利用できません。

または、ディスク容量を最も多く使用するファイル/フォルダーはどれですか(ヘッドリビジョンだけでなく、すべてのリビジョンを合わせて)

何か案が?

4

2 に答える 2

5

Subversion でノードが使用するストレージの量は、見かけほど簡単ではありません。私は FSFS について話します (そして FSFS のみの答えのハックを提供します)。それは、ほぼ確実にあなたが使用しているファイルシステムの実装だからです。BDB を使用している場合は、状況が少し異なります。

ノードは 4 つの方法でストレージを使い切ることができます。ノードの実際のテキストまたは本体、プロパティ、および既存の性質上、それらの存在を示すディレクトリ ノード内のストレージを使用します (ディレクトリ ノードには、子の辞書と子の表現で構成される本体があります)。最後に、ファイル システムのオーバーヘッド (ファイルにコミットすると、ディレクトリの新しい表現がルートまでバブルアップされるため、ストレージの使用は、ストレージが必要になった原因となったファイルに属する必要があると思います) .

ファイルのテキストとプロパティが占めるスペースは、比較的簡単に把握できますが、ディレクトリ ストレージとオーバーヘッドははるかに困難です。しかし、ファイル テキストの比較的簡単な質問であっても、表現の共有により、やや複雑になります。表現の共有は、2 つのファイルが同一である場合に発生します (ファイルが同じ名前であっても問題ありません。重要なのはテキストが同じであることだけです)。再度保存することは避けます。

次のワンライナーは、単一のファイルのファイル テキストの質問に答える必要があります。

REPO=~/my-repo; FILE=/somebigfile; grep --recursive --no-filename --text --before-context 3 "cpath: $FILE" "$REPO/db/revs/"* | grep 'text:' | cut -d' ' -f 1-7 | sort -u | awk '{ DISK+=$4; if ($5 == 0) { FULL += $4 } else { FULL += $5 } } END { print DISK, FULL, FULL-DISK}'

REPO をリポジトリへのパスに設定し、FILE をリポジトリ内の必要なファイルへの絶対パスに変更する必要があります。詳細を忘れている可能性があるため、これは完全に機能しない可能性があります。しかし、これがどのように機能するかを説明しましょう。

探しているファイルのすべてのリビジョン ファイルを grep し、前の 3 行と一致行を要求します。次に、テキストを含む行 (テキスト表現を詳述する行) 以外のすべてを削除します。次に、最後のフィールド (固有表現。共有表現を区別するために使用されます) を除外します。これにより、実際に保存した一意の表現に限定することができます。次に、5 番目と 4 番目のフィールド (それぞれフル テキスト サイズと表示サイズ) を合計します。全文サイズはゼロにすることができます。これは、表現サイズと同じであることを意味します (デルタではなく全文を格納しました)。最後に、次のフィールドを出力します: 実際に保存した場合のサイズ、ファイルのすべてのバージョンの全文のサイズ、

テキスト データのフィールドは次のとおりです。

revision offset_in_rev_file size_of_rep size_of_full_text md5 sha1 uniquifier

古いリポジトリには、これらのフィールドのすべてが含まれていない可能性がありますが、問題ありません。

テキスト フィールドが rev ファイルの cpath フィールドの 3 行以内にあることに依存しているため (簡単なハックです)、完全に機能しない可能性があります。最初の 2 つの grep コマンドを残りをすべて実行せずに実行してから、提供されたリビジョンを確認することをお勧めします (それらは左からの最初の番号のセットになります)。それをファイルのoutoutと比較してくださいsvn log。すべての回転数がそこにある場合、それは正確なはずです。

時間があれば、(SVN ライブラリを使用して) 正しい方法でこれを行うユーティリティを書き上げようと思いますが、それはより便利です。おそらく、プロパティによって使用されるストレージが含まれ、上記で言及した他のストレージの一部が含まれる可能性があります。

TL;DR答えるのは簡単な質問ではありません。上記のシェル スクリプトを使用して、ファイル テキストの格納に応答します。ディスク上で使用したスペース、すべてのリビジョンの全文のスペース、および節約した量を出力します (負の値は、デルタ オーバーヘッドのためにスペースを失ったことを意味します)。

于 2013-02-21T01:04:09.170 に答える
1

リポジトリをダンプし、バイナリの古い不要なバージョンを除外してから、ダンプを同じ名前のリポジトリにロードすることができます。

ツール/ビルドはどのように見えますか?

心に留めておくべきもう 1 つのこと - git または hg に移行する場合、クローンを作成するたびに、それらのバイナリ ファイルの履歴全体を取得することになるため、クライアントでもディスク容量が問題になります。

于 2013-02-20T14:40:13.003 に答える