「Subversion実践入門」を読み終えて(ASUB会まとめ)

4月11日ごろからid:taje4120と毎朝少しずつSubversion実践入門という本を読んだ。
朝にサブバージョンを勉強する会だからASUB会と名前をつけた。
その勉強会も終わり、1週間ほどたったので復習をかねて内容をまとめる。

Subversion実践入門」を読んで得られたこと

本書を読む前によくわかっていなかったことをベースにふりかえる

いまcommitしたら何がcommitできるか知りたい
svn status [file_name]
いまupdateしたら何がupdateされるのか知りたい
svn status --show-updates #-uだけでもOK
trunk branches tagsの使い分け

プロジェクトのリポジトリは以下のようにツリーを分けるのが慣習になっている

  • 開発のメインラインとしてのトランク(trunk)
  • 完成したコードをまとめるブランチ(branches)
  • プロジェクトのイベントを記録するタグ(tags)
タグを作るタイミング

()内は名前の付け方

  • リリースするとき(REL-リリースバージョン)
  • 大きなバグの修正前と修正後(PRE-チケット番号, POST-チケット番号)
ブランチを作るタイミング

()内は名前の付け方

  • リリース準備(RB-リリースバージョン)
  • 大きなバグ修正(BUG-チケット番号)
  • 実験(TRY-説明)

たとえばソフトウェアのリリースが近くなったらリリースブランチを作り仕上げを行う。リリースブランチでのバグ修正などはトランクにマージする。

svn mkdir -m "creating branche" svn://example/sesame/branches
svn copy -m "creating RB-1.0" svn://example/sesame/trunk svn://example/sesame/branches/RB-1.0
mergeのやり方

mergeはいろいろなやり方がある。僕の場合はツリーをmergeすると考えると非常にややこしいので、あるディレクトリからあるディレクトリにupdateすると考えたほうがわかりやすかった。mergeはリモートからローカル、もしくはローカルからローカルで行う。
特定のブランチの変更を作業コピーにリビジョンを指定してマージする

svn merge -r37:39 svn://localhost/dirname

(37と39の数字を逆にして、変更を戻すこともできる)
特定のタグと特定のタグの間の変更を作業コピーにマージする

svn merge svn://localhost/tags/PRE-ticket_id svn://localhost/tags/POST-ticket_id

PRE-ticket_idからPOST-ticket_idまでの変更をマージしている
この方法でローカルのディレクトリ同士もマージできる

update時のステータスについて

気がついてなかったけど、ステータスは2列あった

$svn update
U  index.html  #=> 中身に変更があった
UU sitemap.xls #=> 中身と属性に変更があった
 U _notes      #=> 属性だけに変更があった
  • A…ファイル追加
  • U…アップデート
  • D…削除
  • G…マージ
  • C…コンフリクト
属性の操作

Subversionではファイルやディレクトリに属性をつけることができる。属性の名前は自由につけることができるがsvnで予め予約されている属性名というものがあり、それは使用できない。通常予約済みの属性はsvn:〜で始まる

svn propset checked-by "toyoshi" Number.txt #=> Number.txtにchecked-byという名前の属性をtoyoshiで付ける
svn propedit checked-by Number.txt #=> エディタを開いて属性をセット(複数行設定できる)
svn proplist Number.txt #=> 設定されている属性を一覧
svn propget checked-by Number.txt #=> 属性の値を取得
svn propdel checked-by Number.txt #=> 属性の削除

setやlistは-Rで再帰的に実行できる

競合(コンフリクト)の解決

競合してコミットできなかったらとりあえず更新する(とりあえず聞かれるオプションはpostponeを選択)
競合したファイルがexample.txtだったばあい、svnが自動で以下のファイルをつくる

  • example.txt
  • example.mine
  • example.rn (nは作業コピーのリビジョン番号)
  • example.rm (nはリポジトリのリビジョン番号)

example.txtを意図どおりに編集する、そして

svn resolved [filename]

これで、自動で生成された.mineとかのファイルも消えるので、コミットしなおしてやればよい

本書を読み終えて

たった13回読むだけでこれほどすっきりするとは思わなかった。この本は240ページほどあるが、半分近くの内容が特定の環境やソフトでの話しだったり、本文の内容もヘンなたとえ話などがでてきて(これが理解を助けていたのかもしれないが)本当に読まなくてはならない箇所は少ないので読みやすい。
これから学びたいという人にもお勧めできる1冊です。