2006年11月15日

とある平和なある週末に事件は起こった
xx:14 ([aopy]+) stfuawsc汚染なコードをciってまった

xx:14 (A) ちょ
xx:14 (B) ww
xx:14 (C) www
xx:14 (D) stfuawsc
xx:14 {[ainOS]+} パネラーディスカッション
という事で、直近のコミットした内容をこの世から抹消しなければならなくなった。
しかもtrac上のデータもあわせて..!
消したいリビジョンは100である。

svnのデータを消す

コマンドだけで直前のコミットを取り消せないものかと調べたが、出来ないという事が分かった。
ちょっと冷静になって、svnadmin dumpとsvnadmin loadの組み合わせで何とか出来ないか?と考え
$ svnadmin dump /svn/public > /tmp/public.dump
して該当データを探してみた
Revision-number: 100
Prop-content-length: 112
Content-length: 112

ここからデータ

最後のほうに、該当するデータっぽいのを発見出来た、Revision-numberも100と書いてあるので、当たりっぽい。
Content-lengthとかもあって大分親切。なんかmailのフォーマットぽい。

って事で、このRevision-number: 100の行からファイル末尾まで削除して

$ cat /tmp/public.dump | svnadmin load /svn/public.new
$ mv /svn/public /svn/public.old
$ mv /svn/public.new /svn/public
した。
そして、手元のcoしたディレクトリでsvn upしてみたら
Reference to non-existent revision 100 in filesystem '/svn/public/db'
と言われたお><
落ち着いて
$ svn up -r 99
したら、エラーが出なくなった。

これでsvnの証拠隠滅は完了した。

tracのデータのつじつまあわせ

気を良くしてtracにアクセスしたら、見た事のないエラーが出てびっくりした。
そりゃそうだ、リポジトリの中とtacの中のデータが不整合してるからだ。

tracはsqliteつかってるので

$ sqlite3 /trac/public/db
してsqlを使える状態にして、あれこれ調べた。
で、大体消す場所を把握したので
sqlite> delete from revision where rev = 100;
と打った、しかしtracがまだ怒ってる!
もう少しデータを漁って、ようやく別の消すデータを発見
sqlite> delete from node_change where rev=100;
これでどうだ!

見事、問題のコミットは帳消しに出来ましたとさ。
めでたBoofyめでたBoofy

追記:
svnのいらないリビジョンはsvnadmin dump -r 0:99 | svnadmin load とかで消せて。
trac-admin resync で同期が取れるそうです。

みなさま突っ込みありがとうございます。

Posted by Yappo at 2006年11月15日 23:32 | TrackBack | tech
Comments

はじめまして。
svnadmin dump -r 0:99 | svnadmin load ...
といった具合に、dumpのときに必要なリビジョンまでを指定する手もありますよ

Posted by: Hirraku at 2006年11月16日 09:40

トラバがなぜかできないみたいなので、コメントで。
tracの方は
trac-admin resync
このコマンドで、問題なく同期してくれると思いますよ。

Posted by: Ryo at 2006年11月16日 10:23
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。