Subversion メモ

目次

基本概念と特徴

リポジトリ

グローバルなリビジョン番号

アトミックなコミット

ファイルの移動とディレクトリの作成・削除

マニュアルへのリンク

基本操作

リポジトリの作成
(svnadmin create)

モジュールの登録
(svn import)

モジュールの取り出し
(svn checkout)

作業コピーの状態
(svn status)

履歴の確認
(svn log)

変更点の差分をみる
(svn diff)

編集の取り消し
(svn revert)

以前のリビジョンに戻す
(svn cat / svn merge)

編集の反映
(svn commit)

ツリーの変更
(svn add/delete/copy/move/mkdir)

アイテムの追加
(svn add / svn mkdir)

アイテムの削除
(svn delete)

アイテムのコピー
(svn copy)

アイテムの移動
(svn move)

作業コピーの更新
(svn update)

衝突の解消

衝突の検出

衝突を「手で」マージする

作業ファイルに、一時ファイルのどれかを上書きする

svn
revert の利用

ブランチとマージ

ブランチとは

ブランチの作成
(svn copy)

ブランチ間の変更共有
(svn merge)

ブランチ全体をマージする

作業コピーのブランチ切り替え
(svn switch)

タグを付ける
(svn copy)

ブランチの削除
(svn delete)

環境設定

実行時設定領域

環境変数

属性

psvn.el
-- Emacs フロントエンド

準備

ログメッセージに日本語を使う

キーバインド一覧

インストール

subversion-1.1.1
on Mac OS X 10.3.6

リンク

基本概念と特徴

リポジトリ

Subversion は共有情報の一元管理システムであり、情報はリポジトリに格納される。リポジトリは情報をファイルシステムツリー
(一般的なファイルとディレクトリの階層構造) の形で保持する。

Subversion ではリポジトリの場所は URL によって表現される。リポジトリにアクセスするための URL には以下のようなものがある。
file:/// リポジトリへの直接アクセス (ローカルディスク上)
http:// Apacheサーバ への WebDAV プロトコル経由でのアクセス
https:// http:// と同じだが、SSL による暗号化
svn:// svnserve サーバに対する独自 TCP/IP プロトコル経由でのアクセス
svn+ssh:// svn:// と同じだが、SSH トンネルを利用する

ほとんどの場合、Subversion の URL は標準的な構文を使っており、サーバ名とポート番号を指定することもできる。

file: はローカルリポジトリの場合にのみ有効である。
$ svn checkout file:///path/to/repos
$ svn checkout file://localhost/path/to/repos

グローバルなリビジョン番号

リポジトリがコミットを受け付けるときは、常にリビジョンと呼ばれるファイルシステムツリーの新しい状態を作る。それぞれのリビジョンには一意な自然数が割り当てられ、前のバージョンよりも後のバージョンのほうが数が大きくなる。リポジトリ新規作成時の最初のバージョンはゼロで、ルートディレクトリ以外には何も含まれてない。

Subversion
のリビジョン番号はリポジトリツリー全体に対して付けられるもので、個々のファイルに付けられるものではない。それぞれのリビジョン番号はツリー全体を指定し、あるコミットによる変更後のリポジトリの特定の状態を示す。作業コピーは常にリポジトリのどれか一つのリビジョンに対応しているとは限らず、複数の異なるリビジョンのファイルを含む可能性がある。

アトミックなコミット

CVS では複数のファイルを1つのコマンドラインでコミットしても実際にはファイルごとのコミットとなるが、Subversion
では常にコミットした単位でリビジョンの更新が行われる。

svn commit
は一つのトランザクションとして任意の数のファイル、ディレクトリに対する変更点を登録することができる。作業コピー中で、ファイルの内容を変えたり、新しいファイルを作ったり、削除したり、名前を変えたり、ファイルやディレクトリをコピーしたあと、それらの変更点の全体を完全なひとかたまりのものとしてコミットする。

ファイルの移動とディレクトリの作成・削除

これらの操作は CVS ではうまく扱えないが、Subversion では大丈夫。

マニュアルへのリンク

2. 基本概念

付録 A. CVS ユーザのための
Subversion

基本操作

リポジトリの作成 (svnadmin create)

svnadmin create コマンドで Subversion リポジトリを作成する。リポジトリのデフォルトのバックエンドは BerkeleyDB
であるが、 Subversion 1.1 からは FSFS を指定することもできる。どちらがいいのかよくわからないが、「枯れていない」という点を除けば FSFS
がよいかもしれない。
$ svnadmin create /path/to/repos

$ svnadmin create --fs-type fsfs /path/to/repos
$ svnadmin create --fs-type bdb /path/to/other/repos

BerkelyDB と FSFS の違いについては以下を参照。

5.
リポジトリの管理 / リポジトリの基礎 / リポジトリの保存形式

現在のところ Subversion
ではリポジトリ内のアクセスコントロールができないので、リポジトリはアクセスコントロールをしなくてよいコミッターのグループ単位で作成するとよい。

Subversion ではブランチ／タグの処理をコピー操作で行うため、以下のようなディレクトリをあらかじめ作成しておく慣習になっている。

trunk/ -- 開発を進めていくところ (CVS の HEAD)

branches/ -- ブランチを入れておくところ

tags/ -- タグを入れておくところ

リポジトリが複数プロジェクトを含む場合は、プロジェクトごとにレイアウトをインデックス化する。
/
paint/
trunk/
branches/
tags/
calc/
trunk/
branches/
tags/

似たような目標や共有するコードと一緒にまとめてもよい。
/
utils/
paint/
trunk/
branches/
tags/
calc/
trunk/
branches/
tags/
office/
spreadsheet/
trunk/
branches/
tags/

詳しくは以下を参照。

5. リポジトリの管理 /
プロジェクトの追加

マニュアルへのリンク

2. 基本概念

5. リポジトリの管理

9. Subversion
リファレンス / svn サブコマンド / svnadmin create

モジュールの登録 (svn import)

新しいプロジェクトをリポジトリに登録するにはディレクトリを指定して svn import を実行する。
$ svnadmin create /usr/local/svn/newrepos
$ svn import -m 'import project' mytree file:///usr/local/svn/newrepos/some/project
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h

Committed revision 1.

上の例ではディレクトリ mytree の内容がリポジトリ中の some/project ディレクトリの下にコピーされる。
$ svn ls file:///usr/local/svn/newrepos/some/project
bar.c
foo.c
subdir/

CVS ではカレントディレクトリ以下をインポートするが、 Subversion
ではディレクトリを指定してインポートすることに注意。「.」でカレントディレクトリを指定することができるが、ログメッセージ用に作られる一時ファイルもインポートされてしまうのでやらないほうがよい。

マニュアルへのリンク

3.
同伴ツアー / 役に立つコマンド

5.
リポジトリの管理 / プロジェクトの追加 / レイアウトの作成と初期データのインポート

9. Subversion
リファレンス / svn サブコマンド / svn import

モジュールの取り出し (svn checkout)

作業コピーをリポジトリから取り出すには svn checkout コマンドを用いる。
$ svn checkout http://svn.collab.net/repos/svn/trunk

リポジトリは URL で指定する。リポジトリのパス名の最後のディレクトリが作業コピーとして作成される。このコピーはコマンドラインで指定した
Subversion リポジトリの HEAD (最新のリビジョン) になる。

リポジトリ URL の後に作業ディレクトリの名前を指定することもできる。
$ svn checkout http://svn.collab.net/repos/svn/trunk subv

作業コピー中の .svn ディレクトリ

作業コピーディレクトリに作成される .svn ディレクトリは CVS の CVS ディレクトリに相当するもので、Subversion
の管理情報を含んでいる。削除したり変更したりしないこと。

どのリポジトリからチェックアウトしたかは svn info コマンドでわかる。
$ svn info

マニュアルへのリンク

3. 同伴ツアー /
最初のチェックアウト

9. Subversion
リファレンス / svn サブコマンド / svn checkout

作業コピーの状態 (svn status)

作業コピーに加えられた変更点を検出するには svn status コマンドを用いる。引数なしで実行するとツリー全体の変更が検出できる。
$ svn status

CVS では cvs update コマンドで変更点を調べるが、 Subversion
ではリポジトリにコミットされた変更を作業コピーに反映するだけである。変更確認に update を使う癖を直さなければならない。

svn status コマンドの出力の行頭5桁の意味は次の通り。

1桁目 -- 追加 / 削除 / 変更など
' ' no modifications
'A' Added
'C' Conflicted
'D' Deleted
'G' Merged
'I' Ignored
'M' Modified
'R' Replaced
'X' item is unversioned, but is used by an externals definition
'?' item is not under version control
'!' item is missing (removed by non-svn command) or incomplete
'~' versioned item obstructed by some item of a different kind

2桁目 -- ファイルやディレクトリの属性
' ' no modifications
'C' Conflicted
'M' Modified

3桁目 -- 作業コピーのロック
' ' not locked
'L' locked

4桁目 -- 履歴付きの追加予告
' ' no history scheduled with commit
'+' history scheduled with commit

5桁目 -- 作業コピーからブランチへのスイッチ (svn switch コマンド)
' ' normal
'S' switched

マニュアルへのリンク

3.
同伴ツアー/ 基本的な作業サイクル / 自分の変更点の調査 / svn status

9. Subversion
リファレンス / svn サブコマンド / svn status

履歴の確認 (svn log)

ファイルやディレクトリの履歴に関する情報は svn log コマンドで得られる。
$ svn log

一つのファイルやディレクトリの履歴をみることもできる。
$ svn log foo.c
$ svn log http://foo.com/svn/trunk/code/foo.c

マニュアルへのリンク

3.
同伴ツアー / 履歴の確認 / svn log

9. Subversion
リファレンス / svn サブコマンド / svn log

変更点の差分をみる (svn diff)

自分の変更点を調べるには svn diff コマンドを用いる。出力形式は unified diff 形式である。
$ svn diff

svn diff は .svn 領域にある「修正元リビジョンのコピー」に対して作業コピー中のファイルとの比較を行う。

マニュアルへのリンク

3.
同伴ツアー/ 基本的な作業サイクル / 自分の変更点の調査 / svn diff

3.
同伴ツアー / 履歴の確認 / svn diff

9. Subversion
リファレンス / svn サブコマンド / svn diff

編集の取り消し (svn revert)

foo に対する変更を取り消して最後にアップデートまたはコミットした内容に作業コピーを戻すには svn revert コマンドを用いる。
$ svn revert README.txt

Subversion は指定されたファイルを .svn 領域にある「修正元リビジョン」のコピーで上書きすることよって修正以前の状態に戻す。 svn
revert コマンドはどのような予告操作も取り消すことに注意すること。

svn revert ITEM は作業コピーから ITEM を削除し svn update -r BASE ITEM
を実行するのとまったく同じ効果があるが、svn revert にはリポジトリと通信する必要がない。

マニュアルへのリンク

3.
同伴ツアー/ 基本的な作業サイクル / 自分の変更点の調査 / svn revert

9. Subversion
リファレンス / svn サブコマンド / svn revert

以前のリビジョンに戻す (svn cat / svn merge)

以前のリビジョンのファイルをみる

以前のリビジョンのファイルをみるには svn cat コマンドを用いる。
$ svn cat --revision 2 rules.txt > rules.txt.v2

以前のリビジョンに戻す

svn merge コマンドを使うと、反対向きの差分を指定して作業コピーの変更を「取り消す」ことができる。以下はリビジョン 303 を破棄して 302
に戻す例である。
$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U integer.c
$ svn commit -m "Undoing change committed in r303."

あるファイルだけ以前のリビジョンに戻すことも可能である。
$ svn merge -r 7:6 hello.c
U hello.c
$ svn commit -m 'reverted to 6' hello.c

マニュアルへのリンク

3.
同伴ツアー / 履歴の確認 / svn cat

4.
ブランチとマージ / マージ操作の一般的な例 / 変更の取り消し

9. Subversion
リファレンス / svn サブコマンド / svn cat

9. Subversion
リファレンス / svn サブコマンド / svn merge

編集の反映 (svn commit)

ファイルの編集後は svn commit コマンドで変更点をリポジトリに反映する。
$ svn commit -m "add exit." hello.c

--message (あるいは -m) オプションでログメッセージを指定することができる。 --file (あるいは -F)
オプションでファイル名を指定することもできる。 --message も --file も指定しなかった場合にはエディタを起動しログメッセージを作成しようとする。

--file で指定したファイルがバージョン管理下にある場合には --force-log スイッチを使う必要がある。
$ svn commit --file file_under_vc.txt foo.c

削除予告ファイルをコミットする。
$ svn commit -m "removed file 'c'."
Deleting c

Committed revision 7.

ツリーの変更 (svn add/delete/copy/move/mkdir)

ファイルやディレクトリを削除 / 追加 / コピー / 移動する場合には、まず add/delete/copy/move
などのコマンドを用いて「マーク」を設定する。しかるのち commit コマンドを実行し、変更をリポジトリに反映させるという手順が必要である。

アイテムの追加 (svn add / svn mkdir)

通常ファイル / ディレクトリ / シンボリックリンクを追加するには svn add コマンドを用いる。
$ svn add foo

svn add コマンドは foo をリポジトリに追加する予告をするだけで、リポジトリへの登録は次のコミットで行われることに注意。 foo
がディレクトリの場合は foo にあるすべてのファイルが追加予告の対象になる。 foo だけを追加したい場合は --non-recursive (-N)
スイッチを指定する。

ディレクトリの追加について

ディレクトリを追加するには mkdir したディレクトリを svn add コマンドで登録する方法と svn mkdir
コマンドを利用する方法がある。どちらも svn commit が必要。
$ mkdir doc
$ svn add doc
$ svn commit -m 'mkdir doc' doc

$ svn mkdir doc
$ svn commit -m 'mkdir doc' doc

マニュアルへのリンク

3.
同伴ツアー / 基本的な作業サイクル / 作業コピーに変更を加えること

9. Subversion
リファレンス / svn サブコマンド / svn add

9. Subversion
リファレンス / svn サブコマンド / svn mkdir

アイテムの削除 (svn delete)

通常ファイル / ディレクトリ / シンボリックリンクを削除するには svn delete コマンドを用いる。
$ svn delete foo

foo が通常ファイルまたはシンボリックリンクの場合は作業コピーから直ちに削除される。ディレクトリの場合は削除されないが、Subversion
はそれを削除予告の状態に設定する。変更をコミットすると foo は作業コピーとリポジトリから削除される。

ディレクトリを削除するためには、あらかじめそのディレクトリに含まれるファイルを削除し、ディレクトリを空にしておく必要がある。

マニュアルへのリンク

3.
同伴ツアー / 基本的な作業サイクル / 作業コピーに変更を加えること

9. Subversion
リファレンス / svn サブコマンド / svn delete

アイテムのコピー (svn copy)

新しいアイテム bar を foo の複製として作るには svn copy コマンドを用いる。
$ svn copy foo bar

bar が次のコミットでリポジトリに追加される時点でコピーの履歴が記録される (それが foo のコピーであるという履歴)。

マニュアルへのリンク

3.
同伴ツアー / 基本的な作業サイクル / 作業コピーに変更を加えること

9. Subversion
リファレンス / svn サブコマンド / svn copy

アイテムの移動 (svn move)

アイテムの移動あるいは名前の変更を行うには svn move コマンドを用いる。これは以下のコマンドを実行することとまったく同等である。
$ svn copy foo bar; svn delete foo

ただし、svn move は中間ディレクトリを作成しない。

マニュアルへのリンク

3.
同伴ツアー / 基本的な作業サイクル / 作業コピーに変更を加えること

9. Subversion
リファレンス / svn サブコマンド / svn move

作業コピーの更新 (svn update)

他の作業コピーで行われたリポジトリの変更を手ものとコピーに反映させるには svn update コマンドを用いる。
$ svn update
U foo.c
U bar.c
Updated to revision 2.

ファイルに対する変更は行頭に表示される1文字のコードで示される。
A Added 追加
D Deleted 削除
U Updated 更新
C Conflict 衝突
G Merged マージ

マニュアルへのリンク

3.
同伴ツアー / 基本的な作業サイクル / 作業コピーの更新

9. Subversion
リファレンス / svn サブコマンド / svn update

衝突の解消

衝突の検出

svn update の実行時に衝突を検出すると Subversion は3つの追加ファイルを作業コピーに作成する。

filename.mine
作業コピーを更新する前に作業コピー中にあったファイル

filename.rOLDREV
作業コピーを更新する前の BASE リビジョンにあったファイル

filename.rNEWREV
作業コピーを更新したときサーバから受け取ったファイル -- HEAD リビジョンに対応

Subversion はこれら3つの一時ファイルが削除されるまでコミットを許可しない。衝突があった場合は次のいずれかの方法で衝突を解消する必要がある。

「手で」 衝突テキストをマージする。

作業ファイルに、一時ファイルのどれかを上書きする。

svn revert を 実行して、ローカルでしたすべての変更を捨てる。

衝突を解消したら svn
resolved コマンドを実行して一時ファイルを削除する。
$ svn resolved sandwich.txt
Resolved conflicted state of 'sandwich.txt'

3.
同伴ツアー / 基本的な作業サイクル / 衝突の解消

9. Subversion
リファレンス / svn サブコマンド / svn resolved

衝突を「手で」マージする

衝突個所は次のような「衝突マーカ」で示される。
<<<<<<< .mine
Salami
Mortadella
Prosciutto
=======
Sauerkraut
Grilled Chicken
>>>>>>> .r2

「<<<<<<<」から「=======」までが手元の変更、「=======」から「>>>>>>>」までがリポジトリに加えられていた変更である。この部分を適切に変更し
svn resolved, svn commit を実行する。
$ svn resolved sandwich.txt
$ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."

衝突ファイルを編集中に混乱したら作業コピーにある3つの一時ファイルを見ればよい。

3.
同伴ツアー / 基本的な作業サイクル / 衝突の解消 / 衝突を手でマージすること

作業ファイルに、一時ファイルのどれかを上書きする

自分の変更を捨てる場合には Subversion が作った一時ファイルのどれかを単に作業コピーに上書きすることができる。
$ svn update
C sandwich.txt
Updated to revision 2.
$ ls sandwich.*
sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt

3.
同伴ツアー / 基本的な作業サイクル / 衝突の解消 / 作業ファイルの上にファイルをコピーすること

svn revert の利用

自分の変更を捨てて編集をやり直す場合には svn revert コマンドが利用できる。
$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt

この場合には svn resolved コマンドを実行する必要がないことに注意。

3.
同伴ツアー / 基本的な作業サイクル / 衝突の解消 / svn revert の利用

9. Subversion
リファレンス / svn サブコマンド / svn revert

ブランチとマージ

ブランチとは

4. ブランチとマージ参照。

ブランチの作成 (svn copy)

ブランチの作成には svn copy コマンドを用いる。 calc プロジェクトの trunk から my-calc-branch
というブランチを作成するには次のようなコマンドを実行すればよい。
svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk"

以上で、新しいブランチをチェックアウトすることができるようになる。
$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
A my-calc-branch/Makefile
A my-calc-branch/integer.c
A my-calc-branch/button.c
Checked out revision 341.

Subversion ではブランチの作成に「簡易コピー」を用いるので、コピー処理は時間的にも空間的にも軽い処理である。

ブランチ間の変更共有 (svn merge)

ブランチ間で特定の変更点をコピーするには svn merge コマンドを用いる。

my-calc-branch の分岐時のリビジョンを r341 とし、現在 my-calc-branch 上に r343、trunk 上に r344
があるとする。両者の違いは svn diff コマンドで確認することができる。
$ cd my-calc-branch
$ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk
.....

ブランチが分岐してから trunk 上で r344 までに加えられた変更を my-calc-branch の r343
にコピーするには、以下のようなコマンドを実行すればよい。
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk
U integer.c

$ svn status
M integer.c

リビジョン指定 -r 343:344 は「r343 を r344 に追随させる」といった意味に解釈できる。以上で、trunk の変更が
my-calc-branch の作業コピーに反映され、ローカルな修正の一部となった。

マージされた変更を確認したら svn commit を実行するのが普通である。これを「porting
による変更」という。ローカルな修正をコミットする際には、あるブランチから別のブランチに対して特定の変更を移したことを示すログメッセージを残すこと。
$ svn commit -m "integer.c: ported r344 (spelling fixes) from trunk."
Sending integer.c
Transmitting file data .
Committed revision 360.

ある場合には、マージがうまくいかず衝突状態になることもある。マージを諦める場合には svn revert
コマンドでローカルの変更を取り消すこともできる。実際にマージする前にマージしたらどうなるかを調べるには merge コマンドに対して --dry-run
オプションを渡す。
$ svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
U integer.c

$ svn status
# nothing printed, working copy is still unchanged.

ブランチ全体をマージする

my-calc-branch 全体を trunk にマージすることを考える。 my-calc-branch が r341
で作られたとすると、ブランチディレクトリの r341 と HEAD を比較し、その結果を trunk の作業コピーに適用することになる。
my-calc-branch の HEAD と trunk の HEAD を比較するのではないことに注意すること。マージ処理は以下のようになる。
$ cd calc/trunk
$ svn update
At revision 405.

$ svn merge -r 341:HEAD http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile

$ svn status
M integer.c
M button.c
M Makefile

# ...examine the diffs, compile, test, etc...

$ svn commit -m "Merged my-calc-branch changes r341:405 into the trunk."
Sending integer.c
Sending button.c
Sending Makefile
Transmitting file data ...
Committed revision 406.

コミットログメッセージにはマージされた範囲を具体的に書く。これは非常に重要なことである。さもないと、今後のマージに支障をきたすことになる。

ブランチが作成されたリビジョンをみつけるには？

ブランチが作成されたリビジョン（ブランチのベースリビジョンという）を探すには svn log コマンドで --stop-on-copy
オプションを利用する。 --stop-on-copy オプションはターゲットのコピーあるいは名前の変更を見つけるとそこでログの出力を停止する。
$ svn log --verbose --stop-on-copy \
http://svn.example.com/repos/calc/branches/my-calc-branch
...
------------------------------------------------------------------------
r341 | user | 2002-11-03 15:27:56 -0600 (Thu, 07 Nov 2002) | 2 lines
Changed paths:
A /calc/branches/my-calc-branch (from /calc/trunk:340)

$

作業コピーのブランチ切り替え (svn switch)

svn switch コマンドで作業コピーを別のブランチに変換できる。
$ cd calc

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk

$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
Updated to revision 341.

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch

ブランチにスイッチすると作業コピーの内容はそのディレクトリを新しくチェックアウトした場合とまったく同じになる。たいていのブランチはほんの少し内容が異なるだけなので、新たにチェックアウトするより
svn siwtch コマンドを利用したほうが効率的である。 -r オプションでリビジョンを指定することも可能である。

タグを付ける (svn copy)

タグはある時点でのプロジェクトの「スナップショット」である。タグを作成するには svn copy を利用する。 calc/trunk の HEAD
リビジョンのスナップショットを作る場合には以下のようにすればよい。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."

Committed revision 351.

Subversion ではタグとブランチに違いはなく両方とも単にコピーで作られる。

HEAD 以外のリビジョンにタグを付ける場合には、 svn copy コマンドに -r オプションを渡してリビジョンを指定する。

ブランチの削除 (svn delete)

ブランチが不要になった場合は svn delete コマンドで削除できる。
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Removing obsolete branch of calc project."

Committed revision 375.

ブランチはなくなるが本当に削除されたわけではない。単に HEAD リビジョンからディレクトリが削除されただけで、 svn
checkout/switch/list などで古いブランチを見ることができる。

削除したディレクトリを閲覧するだけでは不十分な場合には戻すこともできる。これには svn copy コマンドに -r オプションを渡せばよい。
$ svn copy -r 374 http://svn.example.com/repos/calc/branches/my-calc-branch \
http://svn.example.com/repos/calc/branches/my-calc-branch

Committed revision 376.

ブランチの利用方法としては、個人的なもののほかに「安定版」といった使い方もできる。
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/stable-1.0 \
-m "Creating stable branch of calc project."

Committed revision 377.

環境設定

実行時設定領域

svn コマンドが初めて実行されるとユーザごとに $HOME/.subversion というディレクトリが作成され、その中に servers,
config, README.txt という3つのファイルが配置される。

システム全体の設定領域は /etc/subversion ディレクトリである。システム全体の設定は個人の設定によって上書きされる。

環境変数

SVN_EDITOR :: ログメッセージの作成用エディタの指定

CVSROOT に相当する環境変数はないのだろうか？リポジトリの指定がちょっとめんどくさい気がする。

属性

まだ。

psvn.el -- Emacs フロントエンド

psvn.el は Emacs から Subversion を操作するためのフロントエンドで、 CVS における PCL-CVS に相当する。使い方も
PCL-CVS とよく似ている。 psvn.el は以下の URL から入手できる。

http://www.xsteve.at/prg/emacs/

psvn.el の他に vc-svn.el という VC 版のフロントエンドもある。こちらは CVS 版の emacs では標準で含まれている。

準備

$HOME/.emacs.el に以下の記述を追加する。キーバインドの変更はお好みで。 M-x svn-status で svn-status
モードに入れる。
;;-----------------------------------------------------------------
;; psvn.el
;;-----------------------------------------------------------------
(require 'psvn)

(define-key svn-status-mode-map "q" 'egg-self-insert-command)
(define-key svn-status-mode-map "Q" 'svn-status-bury-buffer)
(define-key svn-status-mode-map "p" 'svn-status-previous-line)
(define-key svn-status-mode-map "n" 'svn-status-next-line)
(define-key svn-status-mode-map "<" 'svn-status-examine-parent)

(add-hook 'dired-mode-hook
'(lambda ()
(require 'dired-x)
;;(define-key dired-mode-map "V" 'cvs-examine)
(define-key dired-mode-map "V" 'svn-status)
(turn-on-font-lock)
))

(setq svn-status-hide-unmodified t)

(setq process-coding-system-alist
(cons '("svn" . euc-jp) process-coding-system-alist))

ログメッセージに日本語を使う

ログメッセージに日本語を使う場合には svn コマンドが適切なロケールで実行されるように設定すること。例えば以下のようなラッパースクリプトを用意する。
#!/bin/sh
#
# * Subversion のログメッセージに日本語を使う方法
#
# - このスクリプトを本来の svn より先にサーチされるパスに置く。
# - process-coding-system-alist に '("svn" . euc-jp) を追加する。
# - $HOME/.subversion/config の log-encoding は設定する必要なし。
#

unset LC_ALL # LC_ALL を消去

LANG=ja_JP.eucJP # ロケールを euc-jp に設定
LC_TIME=C # ただし、日付は英語で表示

export LC_TIME LANG

exec /usr/local/bin/svn "$@"

キーバインド一覧

調査した psvn.el のリビジョンは r12266 (2004-12-09) である。

svn-status-mode-map

svn-status-mode-mark-map (prefix: ∗),
svn-status-mode-property-map (prefix: P),
svn-status-mode-options-map (prefix: O) を含む。

g - svn-status-update: run 'svn status -v'
C-u g - svn-status-update: run 'svn status -vu'
= - svn-status-show-svn-diff run 'svn diff'
l - svn-status-show-svn-log run 'svn log'
i - svn-status-info run 'svn info'
r - svn-status-revert run 'svn revert'
V - svn-status-resolved run 'svn resolved'
U - svn-status-update-cmd run 'svn update'
c - svn-status-commit-file run 'svn commit'
a - svn-status-add-file run 'svn add --non-recursive'
A - svn-status-add-file-recursively run 'svn add'
+ - svn-status-make-directory run 'svn mkdir'
R - svn-status-mv run 'svn mv'
D - svn-status-rm run 'svn rm'
M-c - svn-status-cleanup run 'svn cleanup'
b - svn-status-blame run 'svn blame'
RET - svn-status-find-file-or-examine-directory
^ - svn-status-examine-parent
~ - svn-status-get-specific-revision
E - svn-status-ediff-with-revision
s - svn-status-show-process-buffer
e - svn-status-toggle-edit-cmd-flag
? - svn-status-toggle-hide-unknown
_ - svn-status-toggle-hide-unmodified
m - svn-status-set-user-mark
u - svn-status-unset-user-mark
$ - svn-status-toggle-elide
DEL - svn-status-unset-user-mark-backwards
* ! - svn-status-unset-all-usermarks
* ? - svn-status-mark-unknown
* A - svn-status-mark-added
* M - svn-status-mark-modified
* D - svn-status-mark-deleted
* * - svn-status-mark-changed
* V - svn-status-resolved
* u - svn-status-show-svn-diff-for-marked-files
. - svn-status-goto-root-or-return
f - svn-status-find-file
o - svn-status-find-file-other-window
v - svn-status-view-file-other-window
I - svn-status-parse-info
P l - svn-status-property-list
P s - svn-status-property-set
P d - svn-status-property-delete
P e - svn-status-property-edit-one-entry
P i - svn-status-property-ignore-file
P I - svn-status-property-ignore-file-extension
P C-i - svn-status-property-edit-svn-ignore
P k - svn-status-property-set-keyword-list
P y - svn-status-property-set-eol-style
P p - svn-status-property-parse
O s - svn-status-save-state
O l - svn-status-load-state
O x - svn-status-toggle-sort-status-buffer
h - svn-status-use-history
q - svn-status-bury-buffer

svn-prop-edit-mode-map

C-c C-c - svn-prop-edit-done
C-c C-d - svn-prop-edit-svn-diff
C-c C-s - svn-prop-edit-svn-status
C-c C-l - svn-prop-edit-svn-log
C-c C-q - svn-prop-edit-abort

svn-log-edit-mode-map

C-c C-c - svn-log-edit-done
C-c C-d - svn-log-edit-svn-diff
C-c C-s - svn-log-edit-save-message
C-c C-i - svn-log-edit-svn-status
C-c C-l - svn-log-edit-svn-log
C-c C-? - svn-log-edit-show-files-to-commit
C-c C-z - svn-log-edit-erase-edit-buffer
C-c C-q - svn-log-edit-abort

svn-log-view-mode-map

p - svn-log-view-prev
n - svn-log-view-next
= - svn-log-view-diff
e - svn-log-edit-log-entry
q - bury-buffer

インストール

subversion の tar ball の中に INSTALL というファイルがあり、ここにインストール方法が説明されている。

subversion-1.1.1 on Mac OS X 10.3.6

それによると subversion には BerkeleyDB が必要らしい (Subversion 1.1 からはバックエンドとして FSFS
が利用できるので、実は必ずしも必要ではない)。 2004-12-13 の時点では 4.3.21 が最新だが Mac OS X では動かなかったので 4.2.52
を利用する。パッチが2つ出ているのでこれもあてる。何も指定しないと /usr/local/BerkeleyDB.4.2 にインストールされるようだ。

http://www.sleepycat.com/download/db/index.shtml

% tar zxvf db-4.2.52.tar.gz
% cd db-4.2.52
% patch -p0 < ../patch.4.2.52.1
% patch -p0 < ../patch.4.2.52.2
% cd build_unix
% env CC=gcc CFLAGS=-O2 ../dist/configure
% make
% sudo make install

次に APR (Apache Portable Runtime) と APRUTIL (APR Utility) を入手する。
subversion-1.1.1 の tar ball には 0.9.5 版が含まれているが、 1.0.1
が最新版なのでこれに置き換えることにする。ちなみに、Neon library は最新版 (0.24.7) が含まれていたので、自分で取ってくる必要はない。

http://apr.apache.org/

% tar jxvf subversion-1.1.1.tar.bz2
% cd subversion-1.1.1
% mv apr apr-0.9.5
% tar zxvf ../apr-1.0.1.tar.gz
% mv apr-1.0.1 apr
% mv apr-util apr-util-0.9.5
% tar zxvf ../apr-util-1.0.1.tar.gz
% mv apr-util-1.0.1 apr-util
% env CC=gcc CFLAGS=-O2 ./configure --with-berkeley-db=/usr/local/BerkeleyDB.4.2
% make
% make check
% sudo make install

リンク

本家 :: http://subversion.tigris.org/

公式ガイドの和訳 :: http://subversion.bluegate.org/doc/

鵜飼氏の解説 :: http://ukai.jp/Articles/2003/uu-svn/

寺井氏の Subversion メモ :: http://terai.s55.xrea.com/Subversion.html

psvn.el :: http://www.xsteve.at/prg/vc_svn/

psvn.el の使い方など :: http://sweet.meadowy.net/diary/?date=200406

vc-svn.el の使い方 :: http://www.wizard-limit.net/mt/pc/archives/2004_07_09.html

Copyright © 2004-2005
Masahiro Takagi
Updated: 2005-05-06
20:06:28 JST

Home / Index