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 コマンドで 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 を実行する。
$ 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 http://svn.collab.net/repos/svn/trunk
リポジトリは URL で指定する。 リポジトリのパス名の最後のディレクトリが作業コピーとして作成される。 このコピーはコマンドラインで指定した Subversion リポジトリの HEAD (最新のリビジョン)になる。
リポジトリ URL の後に作業ディレクトリの名前を指定することもできる。
$ svn checkout http://svn.collab.net/repos/svn/trunk subv
作業コピーディレクトリに作成される .svn ディレクトリは CVS の CVS ディレクトリに相当するもので、Subversion の管理情報を含んでいる。 削除したり変更したりしないこと。
どのリポジトリからチェックアウトしたかは svn info コマンドでわかる。
$ svn info
作業コピーに加えられた変更点を検出するには 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 foo.c $ svn log http://foo.com/svn/trunk/code/foo.c
自分の変更点を調べるには svn diff コマンドを用いる。 出力形式は unified diff 形式である。
$ svn diff
svn diff は .svn 領域にある「修正元リビジョンのコピー」に対して作業コピー中のファイルとの比較を行う。
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 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 -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.
ファイルやディレクトリを削除 / 追加 / コピー / 移動する場合には、まず add/delete/copy/move などのコマンドを用いて「マーク」を設定する。 しかるのち commit コマンドを実行し、変更をリポジトリに反映させるという手順が必要である。
通常ファイル / ディレクトリ / シンボリックリンクを追加するには 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 foo
foo が通常ファイルまたはシンボリックリンクの場合は作業コピーから直ちに削除される。 ディレクトリの場合は削除されないが、Subversion はそれを削除予告の状態に設定する。 変更をコミットすると foo は作業コピーとリポジトリから削除される。
ディレクトリを削除するためには、あらかじめそのディレクトリに含まれるファイルを削除し、ディレクトリを空にしておく必要がある。
新しいアイテム bar を foo の複製として作るには svn copy コマンドを用いる。
$ svn copy foo bar
bar が次のコミットでリポジトリに追加される時点でコピーの履歴が記録される (それが foo のコピーであるという履歴)。
アイテムの移動あるいは名前の変更を行うには svn move コマンドを用いる。 これは以下のコマンドを実行することとまったく同等である。
$ svn copy foo bar; svn delete foo
ただし、svn move は中間ディレクトリを作成しない。
他の作業コピーで行われたリポジトリの変更を手ものとコピーに反映させるには 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 sandwich.txt Reverted 'sandwich.txt' $ ls sandwich.* sandwich.txt
この場合には svn resolved コマンドを実行する必要がないことに注意。
ブランチの作成には 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 コマンドを用いる。
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 コマンドで作業コピーを別のブランチに変換できる。
$ 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 を利用する。 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 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 から 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-mark-map (prefix: ∗), <!— 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
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
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
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 には 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