kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

リポジトリから履歴の削除(部分バックアップ&再構築)

はじめに

Subversionを使用しています。リポジトリにセキュリティ情報などを誤ってコミットしてしまいました。これを削除する方法を考えています。
通常の削除では、履歴が残ってしまい、セキュリティ情報がリポジトリに残ったままとなります。履歴自体削除する方法を考えています。

Subversionでは、通常、履歴自体を削除する事は出来ないようですが、少し考え方を変えて、現状のリポジトリのバックアップを取り、新しく空のリポジトリを作成し、バックアップからセキュリティ情報部分以外をロードすると目的を果たせそうです。

手順

次のようになるはず。まだ実践していないですが・・・。

1.svnadmin dump <リポジトリパス> | svndumpfilter exclude <パスのプレフィックス>... > dump_yyyymmdd.dat
2.mkdir <新規リポジトリパス>
3.svnadmin create <新規リポジトリパス>
4.svnadmin load <新規リポジトリパス> < dump_yyyymmdd.dat

補足

svnadmin dump
C:\Documents and Settings\hiro>svnadmin help dump
dump: 使用方法: svnadmin dump <リポジトリパス> [-r <下限>[:<上限>]]
                         [--incremental]

ファイルシステムの内容を「ダンプファイル」可搬形式で標準出力にダンプし、その
際フィードバックを標準エラー出力に送信します。ダンプは、リビジョン <下限> か
らリビジョン <上限> まで行います。リビジョンの指定がないときは、リビジョンツ
リーすべてをダンプします。<下限> のみが指定されれば、その一つのリビジョンツリ
ーをダンプします。--incremental が渡された場合にはダンプされる最初のリビジョ
ンは、通常の場合のようなフルテキストとはならず、直前のリビジョンとの差分とな
ります。

有効なオプション:
  -r [--revision] <引数> : リビジョン番号を <引数> (または範囲 X:Y) と指定
                             します
  --incremental            : 増分のみをダンプします
  --deltas                 : ダンプの出力として差分を用います
  -q [--quiet]             : 標準エラー出力に (エラー以外の) 進行状況を出力し
                             ません

リポジトリパス」に、リポジトリ内の各プロジェクトのパスも追記して、特定のプロジェクトだけダンプできるかも?と思って試してみたけど、不正なパスと言われて怒られました。
「svndumpfilter exclude」を使う必要がありそうです。

svndumpfilter include
C:\Documents and Settings\hiro>svndumpfilter help include
include: 指定されたプレフィックスをもたないノードをダンプストリームから取り除
きます。
使用方法: svndumpfilter include <パスのプレフィックス>...

有効なオプション:
  --drop-empty-revs        : フィルタをかけたために空になったリビジョンを取り
                             除きます。
  --renumber-revs          : フィルタをかけた後に残ったリビジョンに番号をふり
                             なおします。
  --preserve-revprops      : リビジョン属性にはフィルタをかけません。
  --quiet                  : フィルタリングを行うときに統計を表示しません。

「パスのプレフィックス」に指定した内容が、リポジトリ内の他のパスからのコピーであった場合、コピー元のパスも、引数に追記する必要があるようです(excludeでも同様です。)次のようになります。

svnadmin dump /aaa/repo | svndumpfilter help include /proj-a/hoge /proj-a/hoge-pre
svndumpfilter exclude
C:\Documents and Settings\hiro>svndumpfilter help exclude
exclude: 指定されたプレフィックスをもつノードをダンプストリームから取り除きま
す。
使用方法: svndumpfilter exclude <パスのプレフィックス>...

有効なオプション:
  --drop-empty-revs        : フィルタをかけたために空になったリビジョンを取り
                             除きます。
  --renumber-revs          : フィルタをかけた後に残ったリビジョンに番号をふり
                             なおします。
  --preserve-revprops      : リビジョン属性にはフィルタをかけません。
  --quiet                  : フィルタリングを行うときに統計を表示しません。
svnadmin load
C:\Documents and Settings\hiro>svnadmin help load
load: 使用方法: svnadmin load <リポジトリパス>

「ダンプファイル」形式のストリームを標準入力から読み、リポジトリのファイルシ
ステムに新しいリビジョンとしてコミットします。リポジトリがそれまで空だった場
合、その UUID はデフォルトではストリーム中で指定されたものに変更されます。進
行状況のフィードバックは標準出力に送られます。

有効なオプション:
  -q [--quiet]             : 標準エラー出力に (エラー以外の) 進行状況を出力し
                             ません
  --ignore-uuid            : ストリーム中にリポジトリ UUID があっても無視しま
                             す
  --force-uuid             : ストリーム中に UUID があればリポジトリに設定しま
                             す
  --use-pre-commit-hook    : リビジョンをコミットする前に pre-commit フックを
                             呼び出します
  --use-post-commit-hook   : リビジョンをコミットした後に post-commit フックを
                             呼び出します
  --parent-dir <引数>    : リポジトリ内の指定したディレクトリでロードします

私の使用環境