Tracと連携しているSubversionのリビジョンを戻す方法

本来、やるべきでは無いと思いますが、どうしてもって時に…


ファイル名を変更したファイルを、何を血迷ったか誤って別々にcommitしてしまいました。。
そのため、ファイル名を変更した事がSubversionで追えなくなってしまったので、やもえずcommitした内容を戻すことにしました。
SubversionリポジトリはFSFS、TracのデータベースはSQLiteです。

Subversionのリビジョン番号を戻す

Subversionのリビジョンを戻す方法は、下記を参考にさせていただきました。

$SVN_HOME/db/revs、revprops配下から、戻したいリビジョン以降のリビジョンファイルを削除

上記2つのディレクトリリに、ビジョン番号と同じファイル名のファイルが作成されていますので、それらを削除します。

$SVN_HOME/db/currentを編集して、現在のリビジョンを削除後の最新リビジョンに変更

currentには、3種類の番号が書かれていて、一番左の番号がリビジョン番号となっているので、それを削除後のリビジョン番号にします。

231 2n 5

こんな場合だと、231がリビジョン番号になります。
他の番号も意味があるようですが、明確に書かれた情報が見つからなかったので、想定ではありますが下記のように思えます。

  • 2番目:追加されたファイル・ディレクトリ数
  • 3番目:moveにより追加されたファイル、ディレクトリ数

ちなみに、これらは0-9a-zでインクリメントされているようで、36進数みたいです。

今回は、ファイル名の変更なので、3番目がインクリメントされていると思われましたが、修正しませんでした。今のところ、問題なく動いているところをみると、2、3番目の数字を使っている箇所はなさそうです。(単なるログ程度?)

Tracで管理しているSubversionのリビジョン情報も戻す

Tracでは、リポジトリブラウザやタイムラインでSubversionのリビジョン情報を蓄積している箇所があるので、Subversion側だけ戻すと、Tracリポジトリブラウザやタイムラインが参照できなくなってしまいます。

sqliteで該当のリビジョンの内容を削除する
                                                                                  • -

追記@2007/01/06
いちいちsqliteでデータを削除しなくても、trac-adminコマンドのresyncで、TracSubversionを再度同期させればOKでした。

trac-admin /trac/hoge resync
                                                                                  • -

Tracで管理しているデータは、Tracの各プロジェクト配下のdb/trac.dbにて管理されています。
このDBの中の、下記のテーブルに、Subversionのリビジョンと同期したデータが入ってます。

  • revision
  • node_change

上記テーブルのカラム名:revにて該当のリビジョン番号のレコードをDELETEすればOKです。

例:現在リビジョン番号が231で、229まで戻したい場合

sqlite trac.db
sqlite> .tables
attachment     milestone      revision       ticket_change
auth_cookie    node_change    session        ticket_custom
component      permission     system         version
enum           report         ticket         wiki

sqlite> delete from revision where rev in ('231','230');
sqlite> delete from node_change where rev in ('231','230');

Tracリポジトリブラウザでちゃんと表示されればOKなはず。


追記@2007/12/19
Tracの0.10.4では、systemというテーブルも更新する必要があるようです。(poolsさん情報ありがとうございます!)

私はtrac0.10.4を利用しているのですがsqliteで更新するテーブルがもう一つありました。
(systemという名前のテーブル)

例:現在リビジョン番号が231で、229まで戻したい場合
update system set value = ’229’ where name = ’youngest_rev’;

メモ

Subversionでは、リビジョン番号毎に差分しか管理していないので、途中のリビジョンを取り消す事は難しいようです。
CVSだと、ファイル単位に差分が管理され、一つのファイルに各リビジョンでの変更内容が書かれているので、リビジョンを戻すとなると再commitするぐらいしか無かったですが、Subversionだとファイル消すだけなので結構手軽かも…

でも、あくまでイリーガルな手段なので、こんな事やるよりも、Subversionリポジトリのバックアップを頻繁に取って置いて、そこから戻す方が安全だと思います。