CVSユーザのためのSubversion TIPS

   このエントリをはてなブックマークに登録    2007/10/31

The Top Ten Subversion Tips for CVS Users」という記事がありました。 Subversionの開発を行っているGoogle社のBrian Fitzpatrick氏が書いているブログ記事のようです。 元々は2004年にONLampで発表されたものだそうです。

以下、要約です。 誤訳などの可能性があるので原文もご覧下さい。

1. ステータスを見るにはstatusを利用しよう

CVSでは、手元のコピーと最新レポジトリとの違いを見たい場合、 cvs updateを使いますが、cvs updateをしてしまうと、違いを知ると同時に手元のコピーが最新の状態にupdateされてしまいます。 (-nを使わない場合。また、statusコマンドもありますがあまり使い勝手は良くありません。) Subversionでは、updateを行わずに状態だけを知る事ができます。


$ svn status
D fish.c
A shrimp.c
M anemone.c

Subversionでは、削除/追加/変更などがあったファイルに関してのみ情報が表示されます。 全てのファイルに関する状態を知りたければ、--verboseオプションを追加します。


$ svn status --verbose
44 23 sally README
44 30 sally INSTALL
44 35 harry trout.c
D 44 19 ira fish.c
A 0 ? ? shrimp.cM 0 ? ? anemone.c
44 36 harry things/rocks.txt

svn updateを行ったときにどのファイルが変更されるかを知るには、--show-updatesオプションを利用します。


$ svn status --show-updates --verbose
* 44 23 sally README
44 30 sally INSTALL
* 44 35 harry trout.c
D 44 19 ira fish.c
A 0 ? ? shrimp.c
M * 44 32 sally anemone.c
44 36 harry things/rocks.txt

updateされるファイルの先頭には「*」マークがつきます。

2. 移動ができる

CVSでは一度作ってしまったものは消す以外にはできない(本気でやりたければレポジトリ直書きが必要)ので、最初にディレクトリやファイルの位置に関して考えるために非常に多くの時間を費やす場合があります。 Subversionではディレクトリやファイルの移動を簡単に行えます。


$ svn move foo.c bar.c
A bar.c
D foo.c

この変更はsvn commitを実行すると反映されます。

さらに、URLで指定してファイルを移動することもできます。


$ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c \
http://svn.red-bean.com/repos/bar.c

3. タグとブランチはコピーである

CVSには、cvs tag、cvs tag -b、cvs rtag、cvs rtag -bによってタグやブランチを作る事ができます。 Subversionでは、全てがコピーです。


 $ svn copy -m "Tag rc1 rel." http://svn.red-bean.com/repos/trunk \
http://svn.red-bean.com/repos/tags/1.0rc1

メイントランクと同じ内容を持つブランチを作成するには、トランクをbranches directoryにコピーするだけです。 タグもレポジトリ内にあるコピーへのパスです。 違いはタグが/tags以下にあり、ブランチが/branches以下にあることです。

タグやブランチのバージョンが混ざったコピーを作成することも可能です。


$ svn copy -m "Mixed branch." . http://svn.red-bean.com/repos/branch/1.2-mixed

4. "delete and update"の代わりに"Revert"を使う

CVSでは、やりなおしたいときに以下のような事をすると思われます。


$ rm I-made-a-boo-boo.txt
$ cvs up
I-made-a-boo-boo.txt
U I-made-a-boo-boo.txt

これでは、2回に分けてコマンドを打たなければならないですし、updateされたときにファイルが最新のものになってしまう場合があります。

Subversionでは、.svnディレクトリに元ファイルを保持しているので、revertコマンドでこれが行えます。


 $ svn revert I-made-a-boo-boo.txt
Reverted 'I-made-a-boo-boo.txt'

これは、ネットワークが無い環境などで特に便利です。

5. 余計なお世話はしない

CVSはCRをCRLFに変更したり、$Id$の内容を変更したりします。 これらの機能は便利ですが、バイナリファイルを台無しにしてくれます。

Subversionでは、テキストもバイナリも同じように扱えます。

Subversionはお願いしない限りは余計な事はしません。 繰り返します。 Subversionはお願いしない限りは余計な事はしません。

テキストファイルで改行コードの自動変更を実行したい場合にはsvn:eol-styleプロパティをnativeにセットし、commitします。


 $ svn propset svn:eol-style native halibut.c

6. ログ

Subversionは、CVSのように同じコミットかどうか良くわからないファイルのログ群ではなく、まとまった情報としてログを出力してくれます。 CVSにはcommitをグループとして扱うという概念がありません。

以下の例のように、何も指定せずにsvn logを実行すると、カレントワーキングディレクトリでのリビジョン1から現在までのログを表示します。


 $ svn log --verbose
---------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 lineChanged paths:
M /trunk/sandwich.txt

Added include lines and corrected # of cheese slices.
---------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 lineChanged paths:
M /trunk/sandwich.txt

Outline sandwich fixins.
---------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 lineChanged paths:
A /trunk/sandwich.txt

Initial import
---------------------------------------------------------------------

7. 失敗したcommitを取り消す

例えば、リビジョン303として行った変更が全くの間違いだったとします。 そのcommitはされるべきではなかったcommitです。 Subversionでは、svn mergeを使って変更を「undo」することが可能です。


 $ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U oyster.c

8. 削除したアイテムの復活

レポジトリから削除してしまったファイルを復活させるには、削除される前のりビジョンからsvn copyを使うのが簡単です。 svn log -v を使ってファイルが削除されたリビジョンを探して、コピーを行いましょう。


 $ svn copy --revision 807 \
http://svn.red-bean.com/repos/trunk/perch.c ./perch.c

9. ブランチへスイッチする

CVSでは、作業ディレクトリをブランチへ移行するにはブランチ名を指定してupdateをします。 Subversionはタグやブランチをレポジトリ内のパスとして扱っているので、ブランチ名を使ってsvn updateをすることはできません。 Subversionではsvn switchコマンドを使いましょう。


 $ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
U myproj/foo.txt
U myproj/bar.txt
U myproj/baz.c
U myproj/qux.c
Updated to revision 31.

10. レポジトリをブラウズしたり、マウントしたり

SubversionレポジトリをApache HTTP サーバで提供している場合、いくつか便利なものがあります。

まず、ブラウザでレポジトリ内を見てまわることができます。 次に、DAVを理解するOSであれば、読み込み専用でマウントすることも可能です。

   このエントリをはてなブックマークに登録