そろそろ必要だなと思い、バージョン管理ソフトSubversionを試してみました。環境はMac OSX 1.4.8。
インストール
Darwinportsでインストール
リポジトリの作成
svnadminでリポジトリを作成。
# mkdir svn
# cd svn/
# svnadmin create repos
# ls -la /Users/myuser/svn/repos/
total 16
drwxr-xr-x 9 root myuser 306 1 9 00:46 .
drwxr-xr-x 4 root myuser 136 1 9 00:46 ..
-rw-r--r-- 1 root myuser 229 1 9 00:46 README.txt
drwxr-xr-x 5 root myuser 170 1 9 00:46 conf
drwxr-xr-x 2 root myuser 68 1 9 00:46 dav
drwxr-sr-x 10 root myuser 340 1 9 00:46 db
-r--r--r-- 1 root myuser 2 1 9 00:46 format
drwxr-xr-x 11 root myuser 374 1 9 00:46 hooks
drwxr-xr-x 4 root myuser 136 1 9 00:46 locks
リポジトリに「svn://〜」でアクセスするためにsvnserveを設定。
# vi /Users/myuser/svn/repos/conf/svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
realm = My First Repository
パスワードを設定しておく。※平文なのでパーミッションに注意すること。
[users]
# harry = harryssecret
# sally = sallyssecret
myuser = testpasswd
ターミナルの文字コードはUTF-8にしておく。クライアント側の表示設定も変更しておくこと。OSX標準のターミナルの場合は、[ターミナル→ウィンドウ設定→文字コードエンコーディング]で「Unicode(UTF-8)」を選択。
svnserveを起動する。
ごく簡単なチュートリアル
以下は実際の作業を想定した操作方法チュートリアル。のつもり。
構成元ディレクトリ・ファイルを用意
# cd /Users/myuser/tmp/
# mkdir trunk
# mkdir branches
# mkdir tags
trunk、branches、tagsという三つのディレクトリを作成するのが一般的らしいので取りあえず作っておきました。ここではディレクトリだけですがファイルも含めることができます。
構成元ファイルをリポジトリに追加する。-mで適当なコメントを添えることができる。
# svn import /Users/myuser/tmp/ svn://localhost/Users/myuser/svn/repos -m "initial import"
認証領域:
'root' のパスワード:
認証領域:
ユーザ名: myuser
'myuser' のパスワード:
追加しています /Users/myuser/tmp/trunk
追加しています /Users/myuser/tmp/branches
追加しています /Users/myuser/tmp/tags
リビジョン 1 をコミットしました。
※初回だけ、ここで「svnは、キーチェーン"X509Anchors"を使用する必要があります。」というダイアログが出てパスワード入力を求められましたが何のパスワードを入力すべきかよくわかりませんでした。入力エラーを何度か間違えたところエラーとしてそのま進んだので取りあえず放置。(´・ω・`)
注意点。
データをインポートした後でも、もとのツリーがバージョン 管理下に入ったわけではないのに注意し てください。作業を始めるには、まずそのツリーのための新しい作業コ ピーをsvn checkoutコマンドで作る必要が あります。「Subversion によるバージョン管理」より
とのことですが、これがわからずしばらく混乱しました。importしたディレクトリはsubversionの管理下に入ったわけではないようです。
作業コピー 用ディレクトリの作成
チェックアウトでリポジトリのデータを作業ディレクトリに持ってくる。
# svn co svn://localhost/Users/myuser/svn/repos/
A repos/trunk
A repos/branches
A repos/tags
リビジョン 1 をチェックアウトしました。
以後、作業コピーである「/Users/myuser/workspace/repos」以下のファイルを更新していきます。内容が確定したらリポジトリにチェックイン(=コミット)していきます。svn ***系の操作コマンドはこの作業コピーのディレクトリ以下でしか使えないようです。
ファイルを作成する。
# echo "subversion test1" > trunk/test1.txt
# echo "subversion test2" > trunk/test2.txt
# svn add trunk/test1.txt
A trunk/test1.txt
# svn add trunk/test2.txt
A trunk/test2.txt
チェックインでリポジトリのバージョンを上げる。上記のように、svn addで明示的に追加しないとチェックインしてもリポジトリに入らない。ファイルやディレクトリの追加、削除、移動を行った場合には常にsvn ***を実行する必要がある。
追加しています trunk/test1.txt
追加しています trunk/test2.txt
ファイルのデータを送信中です..
リビジョン 2 をコミットしました。
ファイルを編集する。
subversion test1
ktkr!!
# svn ci -m "test1.txt modified"
送信しています trunk/test1.txt
ファイルのデータを送信中です.
リビジョン 3 をコミットしました。
基本的な流れはこんな感じのようです。
使い方
上記ではリポジトリからローカルにコピーしたファイルを編集してチェックインしていますが、リポジトリのデータを直接操作することもできます。
以下は、リポジトリに直接アクセスしてディレクトリのmoveを行っています。
リビジョン 4 をコミットしました。
このように、リポジトリのデータが書き換えられた場合にローカルの作業コピーと同期をとる必要があります。こんな感じです。
D tags
A tags2
リビジョン 4 に更新しました。
現在の変更状況とリポジトリとの比較もできます。
subversion test1
ktkr!!
uhawwww okwwww
# svn diff
Index: trunk/test1.txt
===================================================================
--- trunk/test1.txt (リビジョン 4)
+++ trunk/test1.txt (作業コピー)
@@ -1,2 +1,3 @@
subversion test1
ktkr!!
+uhawwww okwwww
trunk/test1.txtの最後の行が追加されていることがdiffの結果からわかります。
ファイルの変更履歴の確認はこんな感じ。
------------------------------------------------------------------------
r3 | myuser | 2007-01-09 01:31:06 +0900 (火, 09 1 2007) | 1 line
test1.txt modified
------------------------------------------------------------------------
r2 | myuser | 2007-01-09 01:28:44 +0900 (火, 09 1 2007) | 1 line
2files generated
------------------------------------------------------------------------
リポジトリから任意のリビジョンのデータを出力することもできます。
# svn export svn://localhost/Users/myuser/svn/repos -r 3
A repos
A repos/trunk
A repos/trunk/test2.txt
A repos/trunk/test1.txt
A repos/branches
A repos/tags
リビジョン 3 をエクスポートしました。
exportした場合は、チェックアウトとは異なり作業コピーにはならないようです。このディレクトリのファイルを更新してsvn ***コマンドを使っても何もおきません。
その他、いろんな事ができるようです。
駆け足でSubversionを試してみましたが、なかなか面白かったかも。