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

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からやり直すことの面倒くささに閉口して、レポジトリデータを直接いじってみたらできました。
カテゴリ: