[Subversion]直近のコミットをなかったことにする方法(レポジトリデータを削除)

Subversionで、間違って巨大なファイルとか個人情報をコミットしてしまったことはないでしょうか?
そのような場合、あわててsvn del したところでレポジトリからデータは消えてくれません。

レポジトリからデータを削除するには、svndumpfilterを使います。
ただ、それだとレポジトリを全ダンプ&フィルタ&全リストアという作業が発生するので面倒くさいです。

実は、簡単にレポジトリから"直近の"データを削除する方法を発見してしまいました。
マニュアルにも書いてない方法なので、実行する場合は自己責任でお願いします。
また実行する前にバックアップをとり、実行後は動作確認をしっかりやりましょう。

以下、Subversion1.7.4で動作確認しました。

Subversionレポジトリのデータ構造

レポジトリ名を"sample"とします。 レポジトリのデータ構造は下記のようになっているはずです。
/path/to/sample/
    README.txt
    conf
    db
        current
        format
        fs-type
        fsfs.conf
        min-unpacked-rev
        rep-cache.db
        revprops
        revs
            0
                1
                2
                3
                4
                [中略]
                999
        transactions
        txn-current
        txn-current-lock
        txn-protorevs
        uuid
        write-lock
    format
    hooks
    locks
このファイル群を直接いじることで、リビジョンをお尻の方(数字の大きい方)から何個でも消していくことができます。

SVNレポジトリから直近のコミットを削除する方法

例えば最新リビジョンが r999 だとして、ラスト3コミット(r999, r998, r997)を削除したいとします。
次のように作業します。

当該リビジョンのDBファイルを削除
rm sample/db/revs/0/999
rm sample/db/revs/0/998
rm sample/db/revs/0/997
"現在リビジョン番号"を 999 → 996 に変更
cat sample/db/current
999
echo 996 > sample/db/current
キャッシュを破棄
echo   > sample/db/rep-cache.db
これで、r999, r998, r997 は存在しなかったことになり、最終リビジョンは r996になります。

なんでこの方法を発見したのか?

svnadminのdump & load を何度もやり直していたときに、1からやり直すことの面倒くささに閉口して、レポジトリデータを直接いじってみたらできました。
カテゴリ:

人気記事