web-dev-qa-db-ja.com

SVNリポジトリからすべての履歴を含むファイルを削除する

すべての履歴を含むsvnリポジトリからファイルを削除する方法はありますか?この問題は、リポジトリにある大きなバイナリファイルを削除するときに発生します。

私はこの状況で役立つかもしれない唯一のアプローチを知っています:

  1. svnadminユーティリティを使用して、すべてのリポジトリをダンプします。
  2. ダンプされたファイルをgrepでフィルタリングします。 Grepはファイル名を使用し、他のダンプファイルに書き込む必要があります
  3. svnadminを使用して最後のダンプファイルをインポートする

しかし、これは複雑すぎて信頼できません。多分別の解決策がありますか?

36
altern

これは最近、コマンドsvndumpfilterではるかに簡単になりました。詳細は、Subversionのドキュメント here を参照してください。基本的に、競合を回避するために(説明 ここ )、リポジトリダンプを取得し、特定のファイルプレフィックスを含めたり除外したりして、各コミットをやり直します。基本的な構文:

svndumpfilter exclude yourfileprefix < yourdump > yournewdump

Excludeはおそらく質問者が探しているものですが、includeを使用して、たとえばリポジトリのサブツリーを抽出し、それを独自のリポジトリとしてスピンオフすることもできます。

SubversionのSubversionの最新リビジョン(非常にメタ)でも、globパターンを使用できます。私は最近、すべてのPDFをリポジトリから削除する必要がありましたが、次のように非常に簡単に実行できました。

svndumpfilter exclude --pattern '*.pdf' < dump > dump_nopdfs

svndumpfilter helpsvndumpfilter help excludeを呼び出すと、使用方法の詳細を確認できます。

33
John McDonnell

しかし、これは複雑すぎて信頼できません。

これが信頼できると見なされるべきではない理由はわかりません。ただし、ファイル、履歴、およびすべてを完全に削除する場合は、このファイルが含まれていた以前のリビジョンへの影響に関係なく、その方法は1つしかなく、その方法は実際には複雑です。そして、そうです。 SVNは、ファイルが削除された後でも、決してファイルを失うことのない1つの目標を持つツールです。それ以外のことを強制するのは難しいはずです。

6
sbi

同じような問題に直面していましたが、1つのファイルだけでなく複数のファイルを削除する必要があり、さらに--paternディレクティブをサポートしていないSubversion 1.6を使用しています。

-現在のSVNのバックアップ

$ cp -R /svn  /svnSAVE

-リポジトリをダンプ

$ svnadmin dump /svn/root > svnDump

-非常に大きなファイルを除外して新しいダンプを作成します

$ svndumpfilter exclude "/path/file.csv" < svnDump > newSvnDump0
-- {note: should see a message like this}:
--          Dropped 1 node:
--                  '/path/file.csv'

-別の非常に大きなファイルを除外しながら、別の新しいダンプを作成します

$ svndumpfilter exclude "/path/anotherFile.csv" < newSvnDump0 > newSvnDump1

-古いsvnを削除します

$ rm -rf /svn

-svnディレクトリを再作成します

$ mkdir -p /svn/root

-SVNを再作成します

$ svnadmin create /svn/root

-新しいリポジトリにダンプを再入力します

$ cat newSvnDump1 | svnadmin load /svn/root

-confファイルを保存されたコピーから新しいコピーに更新します...

$ cp /svnSAVE/root/conf/* /svn/root/conf

これで、リポジトリに2つの大きなファイル「file.csv」と「anotherFile.csv」が含まれてはいけません。

4
user3892260

マクダウェルの提案に同意しますが、大きなファイルを、削除されたエントリのファイルのハッシュのみを含むテキストファイルに置き換えることを検討することをお勧めします。

たとえば、誤ってビルドディレクトリをチェックインした.oファイルが大量にある場合、これは適切ではない可能性があります。ただし、必要なバイナリアーティファクトが多数含まれているディレクトリから、不要なバイナリアーティファクトを削除する場合は、高額な間違いを犯すリスクが高くなります。少なくとも、トランクとほとんどのブランチからそれらを削除することを検討してください。ただし、元のバイナリのハッシュを含むプレースホルダーテキストファイルで機能ブランチを完全に残してください。これは、少なくとも後で何が起こったかを理解し、削除されるべきではない浮遊コピーが実際に正しいファイルであることを確認し、リビジョン管理下に戻すのに十分です。

そして、明らかに、このようなことをする前に、リポジトリ全体をいくつかのM-Discsのような読み取り専用の何かにバックアップしてください。

0
breakpoint