SVNのコミットを完全に取り消す

SVNを使っていくと、うっかりと重要な個人情報や機密データを
コミットしてしまうことがあるかもしれません。

SVNに一度コミットしたリビジョンはクライアント側から削除することが出来ません。
ファイルを追加した後に削除しても、
履歴から追加したファイルをダウンロードできてしまいます。

このような事態に陥ってしまった場合、
サーバから特定のリビジョンまでロールバックすることで
コミットを完全に無かったことにすることが可能です。

今回はこの方法についてのメモ書きです。

1.ダンプの作成
svndumpコマンドにて、戻す先のリビジョンまでのダンプを作成します。

svnadmin dump -r 0:戻す先のリビジョン /path/to/repos > path/to/repos.dump

2.元のリポジトリのバックアップ
リポジトリをリネームしてバックアップを取ります。
このバックアップは失敗したときにやり直し可能にするだけでなく、
confファイルのコピー時に必要になります。

mv /path/to/repos /path/to/repos.bak

3.リポジトリの新規作成
新しいリポジトリをバックアップを取ったリポジトリ名で作成します。

svnadmin create /path/to/repos

4.ダンプの反映
2.で作成したダンプファイルを新規作成したリポジトリに反映します。

※2014/12/27 コマンド修正

svnadmin load /path/to/repos < /path/to/repos.dump

5.confファイルの反映
confファイル内の認証情報等はコピーされないので、
リポジトリのバックアップから手動で上書きコピーします。

rm -fr /path/to/repos/conf
cp -pr /path/to/repos.bak/conf /path/to/repos/conf

6.リポジトリバックアップの削除
※2014/12/27 説明文修正
バックアップが不要なら、以前のリポジトリディレクトリとダンプファイルを削除します。

rm -fr /path/to/repos.bak /path/to/repos.dump

7.リポジトリからの再チェックアウト
ここまで手順を実施すると、リポジトリのリビジョンが前に戻るため、チェックアウト先のディレクトリすべてが使えなくなってしまいます。
(TortoiseSVNでは更新時にエラーとなる)
そのため、新たにリポジトリからチェックアウトしなおす必要があります。
チェックアウトはこれまで通りのやり方で行ってください。

リポジトリサイズによっては時間がかかりますが、手順はワンパターンなので割とすんなりと出来ます。
必要ならこれらの一連の流れをシェル化したほうが賢いでしょう。

履歴ありきのSVNなので、どうしても消さなければいけない情報以外は
残しておいたほうが良いでしょう。

■参考文献
リポジトリのリビジョンのロールバック(取り消し)
Repository Maintenance Chapter 5. Repository Administration
Subversionリポジトリのバックアップ [svnrdump の利用方法]

COMMENTS & TRACKBACKS

  • Comments ( 2 )
  • Trackbacks ( 0 )
  1. By 足柄

    まさにこの操作を調べていたので大変参考になりました。ありがとうございます(ただ、手順4はダンプファイルをリダイレクトしてやるのが正しいのではないかと思いますが)

    • By ftvoid

      >足柄さん

      コメントありがとうございます。
      お役に立てて嬉しいです。

      手順4は足柄さんの仰るとおり、リダイレクトするのが正しいです。
      修正を反映しておきました。