2010-01 / 2010-01-11

前のエントリ: 今更だけどFizzBuzz問題(正規表現で) [perl]
次のエントリ: スキー [diary]

(svndumpfilter)コミットの取り消し
2010-01-11-1 / カテゴリ: [svn] / [permlink]

前提省略して実際にやってみた。
リポジトリのリビジョンの取り消しより
TortoiseSVN は決してデータを失わないため、「巻き戻した」リビジョンはまだ中間リビジョンとして存在しています。HEAD リビジョンが以前の状態になっただけです。すべての痕跡を削除して、リポジトリから完全に見えなくする場合は、もっと極端な手段を採らねばなりません。これは本当に十分な理由がなければ、お勧めしません。考えられる理由としては、誰かが公開リポジトリに機密文書をコミットしたなどでしょう。

リポジトリからデータを削除する唯一の方法は、Subversion コマンドラインツールの svnadmin を使うことです。この実行方法の説明は、Repository Maintenance にあります。(訳注: 日本語訳は Subversion によるバージョン管理 にあります)

使うコマンド
直前の1リビジョンのコミットを全てなかったことにするのであれば、YappoLogs: 悪のりで学ぶsvnadmin/trac入門実用編のとおり、dump/load でいける。でも、特定のファイルのみをなかったことにするには dump/load のみでは対応できない。ここで svndumpfilter を使って、ダンプデータにパスでフィルタリングをかける。

1. 現リポジトリの退避

$ cd /path/svn
$ mv repos repos.org

2. 元と同じ名前で空リポジトリの作成(フィルタ結果をここに置く)

$ svnadmin create repos

3. リポジトリのダンプ

$ svnadmin dump repos.org > repos.dump

4. ダンプのフィルタリング

$ svndumpfilter exclude '/foo/bar/baz' < repos.dump > repos.dump.new
パスはリポジトリにおけるフルパス指定

5. フィルタ結果のリストア

$ svnadmin load repos < repos.dump.new

これで、/foo/bar/baz 以下がなかったことになる。
3,4,5 はパイプで一撃でもいける
$ svnadmin dump repos.org | svndumpfilter exclude '...' | svnadmin load repos

クライアント側は update/commit や、クリーンアップではなかったことにできなかった。よくわからなかったので、ファイルシステム上から単に削除した(^^;


参考
svndumpfilter: 気の向くままに・・・
前のエントリ: 今更だけどFizzBuzz問題(正規表現で) [perl]
次のエントリ: スキー [diary]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12