SVN リポジトリをロード/復元しようとすると、次のエラーが表示されます。
svnadmin: svndiff に含まれるウィンドウが大きすぎます
どうすればこれを解決できますか?
今日これに遭遇したので...
FSFS データベースを含む svn リポジトリに破損したリビジョンがある可能性があります。
SVN リポジトリをバックアップします。
${REPO}/db/format を読み取って、リポジトリがパック/シャーディングされているかどうかを判断します
[root@chi2 db]# cat format
4
layout linear
fsfs データベースが「レイアウト分割」されている場合は、次の場所から fsfs-reshard.py を取得する必要があります: http://ymartin59.free.fr/wordpress/wp-content/2010/07/fsfs-reshard.py
(これは 1.6 以上のリポジトリで動作するバージョンで、この男のパッチはまだ svn トランクに移植されていません)。
次を実行して、リポジトリを解凍します。
./fsfs-reshard.py ${REPO} 0
検証を実行します。
svnadmin verify ${REPO}
* Verified revision 13689.
* Verified revision 13690.
* Verified revision 13691.
svnadmin: E185001: Svndiff contains a too-large window
エラーが発生したリビジョンは、最後に検証されたリビジョンよりも 1 つ大きいリビジョンでした。私たちの悪いリビジョンは 13692 です。
Subversion トランクから fsfsverify.py を取得します。http://svn.apache.org/repos/asf/subversion/trunk/contrib/server-side/fsfsverify.py
悪いリビジョンで fsfsverify.py を実行します。-f オプションを 2 回以上実行する必要がある場合があります。これにより大量のデータが吐き出されますが、最終的にはクリーンになるはずです。
[root@chi2 archive]# ./fsfsverify.py -f ${REPO}/db/revs/13692
Copy 4640123 bytes from offset 1006867
Write 4640123 bytes at offset 1003542
Fixed? :-) Re-run fsfsverify without the -f option
[root@chi2 archive]# ./fsfsverify.py ${REPO}/db/revs/13692
svnadmin verify を再度実行します。さらに悪いリビジョンがある場合は、上記のプロセスを繰り返します。
検証済みのリポジトリを取得したら、実行して再パックできます
./fsfs-reshard.py ${REPO} 1000
svnadmin verify をもう一度実行してください!
SVN リポジトリは問題ないはずです!
この問題の原因を突き止めました。解決に役立つ可能性がありますが、これはリポジトリにあるファイルの種類に大きく依存します。
SVN のファイルは、名前とファイル ハッシュによって記録されます (MD5 されていると思います)。ファイルを削除してから、同じファイルを再度アップロードしようとすると、SVNはハッシュを記憶し、新しいベース デルタ ファイルを作成する代わりに、それが存在した以前のリビジョンをポイントします。
リポジトリの寿命のある時点で、ファイルは「汚染」されています。ファイルの MD5 に一致するファイル (コミット パスに関係なく) は、SVN が古い壊れたリビジョンを使用しようとするため、svndiff プロセスに失敗します (理由はまだ完全には明確ではありません)。問題を「修正」したい場合は、ファイルをローカルで変更します (コードの場合は、空白のコメントを追加してみてください)。これにより、MD5 が変更されます。ファイルを削除し、新しい「修正済み」バージョンをコミットすると、サービスは通常どおり再開されます。
さて、最初のパラグラフに戻りますが、このソリューションは、変更する余裕のあるファイルでのみ実際に機能します。たとえば、100MB のビデオ ファイルがある場合、ハッシュを変更するために何らかの方法でファイルを変更する必要があります。実行可能ファイルを使用している場合は、コンパイル後の変更が非常に難しいことで知られているため、さらに悪化します。
私の推奨事項は次のとおりです。
これが何らかの助けになることを願っています。この問題の根底にたどり着くのは本当に大変でした。