2009年4月11日土曜日

subversion - コマンド編

* チェックアウト
> svn checkout svn://olio/sesame/trunk
 この例だとチェックアウト元のディレクトリ名になってしまう。
 ディレクトリ名を変更したい場合は、もう一つ引数を与えてあげるといい。

> svn checkout svn://olio/sesame/trunk sesame
 これで、最新のリビジョンが、sesameディレクトリにチェックアウトされる。

過去のリビジョンを指定してチェックアウトをしたい場合は、もう1つ引数を与えるといい。
> svn checkout -r 7 svn://olio/sesame/trunk old-sesame

作業コピーのチェックアウト元を調べたい場合は、svn info が使える。
Repository Rootってのが二行目ぐらいにあって、それがどこからコピーされたものかがわかる。

* 最新状態の維持
 作業を進めているうちに別の開発者がリポジトリを普通に更新されていく。
 そのときには、比較的短い期間で更新をしていったほうが競合の可能性が少ないので、
 結果的に手間が少なくなる。通常一時間程度で更新を続けるのが望ましい。

 svn updateを使うと、そのディレクトリ以下にあるすべてのファイルが再帰的に更新されて、
 リポジトリと同期される。

 その結果、リポジトリに追加されたファイルとディレクトリは作業コピーに追加される。
 逆に、リポジトリから削除されたファイルとディレクトリは作業コピーからも削除される。

 一部だけ同期を取りたい場合は、svn update の後ろに指定してあげるのも可能だ。
 でも、他のファイル群と一貫性が一時的に保たれなくなるので、注意も必要になる。

> svn update build.xml src/ test/

> 誰かがコミットした時に電子メールが関係者に配信されるように設定もできる
http://svn.haxx.se/users/archive-2006-05/att-0593/SVN-Apache-SVNNotify-HowTo-En.pdf
CPANのモジュールを使うのが一番簡単?それとも, post-commitに仕込みを入れるのがいいのかも。

* 変更の読み方
 A:リポジトリに追加されたファイルを作業コピーに追加された事を示す
 U:作業コピーがリポジトリの更新されたファイルで更新されたことを示す
 D:既にリポジトリから削除されていたので、ローカルファイルも削除されたことを示す
 G:作業コピーのローカルで変更されたファイルにリポジトリの更新が反映されてマージしたことを示す
 C:ローカルで変更済みのファイルがリポジトリのファイルとマージしようとそして失敗した事を示す
  ユーザが修正するまでは、チェックインができなくなる。

ついでに、変更をsubversionが出力する時には、二行出力している。
それは何かと聞かれれば、ファイル本体とファイル属性についてです。

* ファイルとディレクトリの追加
> svn add timelib
とかをすると、ユーザがリポジトリにファイルかディレクトリを追加するように指示できる。
 このときの処理としては、追加予約をしただけであって、実際にはまだ処理が実行されない事に注意。

 実際にリポジトリを修正したい場合は、svn commit を忘れずにすること。

* 属性
 ファイルに属性を付けたい場合は、以下のようにする。
 コードに、Reviewerの名前が付くのもいや感じもするけどなぁ。
 > svn propset checked-by "Mike Mason" Number.txt

subversionで予約済みの属性ってのもいくつかあって、そういう属性はsvn:という
 プレフィックスが付いている。

 複数の行を修正したい場合は、以下の様に
> svn propedit checked-by Number.txt

 属性の一覧を表示するには、以下の様に
> svn proplist Number.txt

 属性の値の取り出しをしたい場合は、以下の様に
> svn propget checked-by Number.txt

 属性の削除をしたい場合は、以下の様に
> svn propdel Number.txt

* 管理対象外としたい場合の指定の方法
 ディレクトリに対して属性を指定すればok
 '.'を指定すると、vimがエラーを返したので上位ディレクトリで、
 > svn propedit sesame としたほうがいいのかも。
 結果の出力をよく見ないとアレ?ということになりかねない。

svn:ignore の属性とかは、コミットされると他のユーザにも影響を与える。
 ついでに補足で、下位ディレクトリまで再帰的には処理を行わない。

* 属性の自動設定
 自動設定は、サーバ側の設定と思われがちだが、実はクライアント側の設定だったりする。
 # 設計ミスってんじゃねーのか、これ。
 んで、ユーザごとに .subversion/config とかファイルがあるんで、その中のエントリにある項目を
 各自修正しないといけない、と。

* ファイルとディレクトリのコピーと移動
 > svn copy Number.txt Data.txt

Changed paths:
A /sesame/trunk/Data.txt (from /sesame/trunk/Number.txt:17)

この場合だと、Numer.txt:17からコピーしてきたことが分かる。

 注1:svn copyやsvn moveは、一度に1つしか指定ができない。
 スクリプトやらシェルの支援機能と組み合わせるのがベター

 注2: svn log のデフォルトだと、あらゆるコピー操作や移動操作とかの前の履歴も全部表示する。
 コピーや移動の後の履歴のみを普通は見たい。
 そう言う場合は、 --stop-on-copy のオプションを指定するといいかも。

 ファイルの名前変更は素直に、svn move を使う方が簡単。
 > svn move Time.java Clock.java

 svn move のログを-v付きで見てみるとオモロいのが、実際には名称変更ってのが、
 コピーして別名で追加処理で、元のファイルの削除をしているだけってこと。

------------------------------------------------------------------------
Changed paths:
A /sesame/trunk/Clock.java (from /sesame/trunk/Time.java:19)
D /sesame/trunk/Time.java

changed file name of Time.java to Clock.java

 ディレクトリについてもファイルと同じファーストクラスの管理対象のオブジェクトなので、
 普通に svn move で、ディレクトリの名称の変更ができる。

0 件のコメント:

コメントを投稿