読者です 読者をやめる 読者になる 読者になる

CodeRepos + svkでmiss

技術

CodeReposはsvkで使ってるんだけど,昨日のautobox::URI::Fetchをコミットしたときに,壮大にミスってしまったようです.

どうにかしなきゃいけないcommit

CodeReposを利用している皆さんにはご迷惑をおかけしました.ごめんなさい.元にもどしてくれたid:yappoさんとid:miyagawaさん++.ありがとうございました.

どのへんがまずかったのか

Yappoさんからのアドバイスにあるように,

$ svk co //local/coderepos/lang/perl/ .

とかしてたのが良くなかったようです.これはつまり,ローカルのブランチから作業コピーをチェックアウトしていることになるのですが,この場合修正をした後,

svk ci
svk push --verbatim //local/coderepos

をすることで,CodeReposに変更を反映することになります.どうやらこれが実に危なくて,svk pushしてしまうと,そのブランチがCodeRepos本体にマージされてしまいます.最後にsvk pullでローカルのブランチを最新の状態にせずにsvk pushすると,古いファイルがマージされてしまって,今回のように,どうにかしなきゃいけないcommitが大量に発生してしまうようです.

普段はsvkは自分しか開発者のいないリポジトリで使っているので,平気でsvk pushしまくっていたんですが,複数人が一度に開発する場合はあたりまえだけどきちんとsvk pullしないと実にまずいです.

どうすればよいのか

というわけで,Yappoさんのアドバイス通り,ローカルにブランチをつくらず,

$ svk co //mirror//coderepos/lang/perl .

とかやるのが良さそうです.これだと,チェックイン時にはかならずネットワークが必要になるものの,CodeRepos本体とローカルブランチのマージとかがないので,自分が作業しているファイル以外への影響がすくなくなります.


どうしてもローカルブランチをつくりたい場合は,

svk cp //mirror/coderepos //local/coderepos

のように全体をブランチにしてしまうのではなくて,

svk cp //mirror/coderepos/lang/perl/autobox-URI-Fetch //local/autobox-URI-Fetch

のように,自分の作業している部分のローカルブランチをつくってsvk pushやsvk pullすればだいじょうぶそうです.

というかむしろmirrorをもっと細かく切って,

svk mirror //mirror/coderepos-perl http://svn.coderepos.org/share/lang/perl
svk sync -s HEAD //mirror//coderepos-perl
svk co //mirror/coderepos-perl .

とかのがいい気がしてきた,svk syncのときに自分の使わないファイルの更新に煩わされなくなってよさげ.

というわけで

CodeReposのsvkの解説ページには,mirrorからチェックアウトするような手順が記載されているので参照してみてください.うちはこれ見ずにいつものノリでsvkして,やってしまいました.やはりちゃんと書いてあることは守らないとだめですね.