リポジトリから特定のコミットを削除する

「公開しちゃいけないコードを間違えてアップしちゃいました。なかったことにできませんか」という連絡が来た。つまりsubversionリポジトリから特定のコミットを削除しろ、ということか。

IRCで質問したところ、以下のFAQを紹介された。

http://subversion.tigris.org/faq.html#removal

svnadmin dumpで取り除きたいコミットを削除してやればいいみたい。

つまり、r1000をなかったことにしたい場合は

svnadmin dump $REPOS --revision 0:999                   > dumpfile0
svnadmin dump $REPOS --revision 1001:HEAD --incremental > dumpfile1
svn create $NEWREPOS
svnadmin load $NEWREPOS < dumpfile0
svnadmin load $NEWREPOS < dumpfile1

なんてしてやれば良いと。

手順

1. httpサーバ停止

/etc/init.d/http stop

2. subversion, tracのバックアップ

svnadmin dump $REPOS > dumpfile
trac-admin $TRAC hotcopy > trac-backup

3. svnリポジトリのダンプ → 新規リポジトリへ追加

svnadmin dump $REPOS --revision 0:999                   > dumpfile0
svnadmin dump $REPOS --revision 1001:HEAD --incremental > dumpfile1
svn create $NEWREPOS
svnadmin load $NEWREPOS < dumpfile0
svnadmin load $NEWREPOS < dumpfile1

4. 旧リポジトリの退避、新リポジトリへ置き換え

mv $REPOS OLD/
mv $NEWREPOS $REPOS

5. tracのデータベース同期

trac-admin $TRAC resync

6. httpサーバ再起動、動作確認

とりあえず

これで何とかなった、ような気はする。

すぐに気がつく問題として、TracのチケットやWikiに記載しているchangesetの番号に整合が取れなくなってしまう点がある。

追記

だめだったみたい。dumpfile1以降のコミットが適用されていないとクレームが付く。結局フルバックアップ取ってあったところから上書きしてもらって事なきを得たけど、なんでそういう事になったかはちょっと実証してみないといけない。週末の課題だな。