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 では大丈夫。

マニュアルへのリンク

基本操作

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

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

$ svnadmin create /path/to/repos

バックエンドは --fs-type で指定します。

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

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

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

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

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

/
    paint/
        trunk/
        branches/
        tags/
    calc/
        trunk/
        branches/
        tags/

似たような目標や共有するコードと一緒にまとめてもよい。

/
    utils/
        paint/
            trunk/
            branches/
            tags/
        calc/
            trunk/
            branches/
            tags/
    office/
        spreadsheet/
            trunk/
            branches/
            tags/

詳しくは以下を参照。

マニュアルへのリンク

モジュールの登録 (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 ではディレクトリを指定してインポートすることに注意。 「.」でカレントディレクトリを指定することができるが、ログメッセージ用に作られる一時ファイルもインポートされてしまうのでやらないほうがよい。

マニュアルへのリンク

モジュールの取り出し (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

マニュアルへのリンク

作業コピーの状態 (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

マニュアルへのリンク

履歴の確認 (svn log)

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

$ svn log

一つのファイルやディレクトリの履歴をみることもできる。

$ svn log foo.c
$ svn log http://foo.com/svn/trunk/code/foo.c

マニュアルへのリンク

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

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

$ svn diff

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

マニュアルへのリンク

編集の取り消し (svn revert)

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

$ svn revert README.txt

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

svn revert ITEM は作業コピーから ITEM を削除し svn update -r BASE ITEM を実行するのとまったく同じ効果があるが、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

マニュアルへのリンク

編集の反映 (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

マニュアルへのリンク

アイテムの削除 (svn delete)

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

$ svn delete foo

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

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

マニュアルへのリンク

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

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

$ svn copy foo bar

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

マニュアルへのリンク

アイテムの移動 (svn move)

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

$ svn copy foo bar; svn delete foo

ただし、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     マージ

マニュアルへのリンク

衝突の解消

衝突の検出

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

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

衝突を解消したら svn resolved コマンドを実行して一時ファイルを削除する。

$ svn resolved sandwich.txt
Resolved conflicted state of 'sandwich.txt'

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

衝突個所は次のような「衝突マーカ」で示される。

<<<<<<< .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つの一時ファイルを見ればよい。

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

自分の変更を捨てる場合には 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

svn revert の利用

自分の変更を捨てて編集をやり直す場合には svn revert コマンドが利用できる。

$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt

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

ブランチとマージ

ブランチとは

ブランチの作成 (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 ディレクトリである。 システム全体の設定は個人の設定によって上書きされる。

環境変数

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

属性

まだ。


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

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

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: &#8727;), <!— asterisk —> 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 にインストールされるようだ。

% 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) が含まれていたので、自分で取ってくる必要はない。

% 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

リンク