Subversionでバージョン管理

導入からリモートでのチェックアウト、コミットまでを簡単に紹介。

導入

Subversion自体はだいたい最初から入ってると思います。

[mikeda@cent ~]$ rpm -qa | grep subversion
subversion-1.4.2-2.el5

なければ「$ sudo yum install subversion」などで。

レポジトリ作成

今回は「/home/mikeda/repos」にレポジトリを作ります。
ここにプロジェクト(ソースコードなんかをまとめたディレクトリ)をつっこんでいくことになります。

[mikeda@cent ~]$ mkdir repos
[mikeda@cent ~]$ svnadmin create repos

中身はとりあえず気にしなくてOK。

[mikeda@cent ~]$ ls repos/
README.txt  conf  dav  db  format  hooks  locks
プロジェクトのインポート

svntestというプロジェクトを作ることにします。
まずテキトウなディレクトリ作ってテキトウなファイルを突っ込みます。

[mikeda@cent ~]$ mkdir tmp
[mikeda@cent ~]$ echo ABC > tmp/ABC.txt

レポジトリにインポートします。
インポート先URLはfile://<レポジトリパス>/svntest/trunkとなります。
svntestじゃなくsvntest/trunkなのはただの慣習です。

[mikeda@cent ~]$ svn import tmp file:///home/mikeda/repos/svntest/trunk -m 'import svntest'
追加しています              svntest/ABC.txt

リビジョン 1 をコミットしました。

ちゃんとインポートされてることを確認したら元ディレクトリは消しちゃってOKです。

[mikeda@cent ~]$ svn list file:///home/mikeda/repos/
svntest/
[mikeda@cent ~]$ rm -rf tmp

listの他にlogやinfoってサブコマンドもうってみてください。

[mikeda@cent ~]$ svn log file:///home/mikeda/repos/svntest
                                                                                                                                              • -
r1 | mikeda | 2009-03-22 23:04:10 +0900 (日, 22 3月 2009) | 1 line import svntest
                                                                                                                                              • -
[mikeda@cent ~]$ svn info file:///home/mikeda/repos/svntest パス: svntest URL: file:///home/mikeda/repos/svntest リポジトリのルート: file:///home/mikeda/repos リポジトリ UUID: 949d2141-9ed2-4f03-b8c1-0ad3e6d4c559 リビジョン: 1 ノード種別: ディレクトリ 最終変更者: mikeda 最終変更リビジョン: 1 最終変更日時: 2009-03-22 23:04:10 +0900 (日, 22 3月 2009)

ローカルでのチェックアウト、コミット

チェックアウト

作業コピーをレポジトリからチェックアウトします。
ローカルレポジトリを参照する場合はURLとしてfile://<パス>を使います。
コマンドはco(checkoutでもOK)です。

[mikeda@cent ~]$ cd work
[mikeda@cent work]$ svn co file:///home/mikeda/repos/svntest/trunk svntest
A    svntest/ABC.txt
リビジョン 1 をチェックアウトしました。
[mikeda@cent work]$ 
[mikeda@cent work]$ ls -a svntest/
.  ..  .svn  ABC.txt
[mikeda@cent work]$ cat svntest/ABC.txt 
ABC
編集、コミット

編集やレポジトリへのコミット、アップデートなどは作業コピーをチェックアウトしたディレクトリで行います。

[mikeda@cent work]$ cd svntest
[mikeda@cent svntest]$ echo abc > ABC.txt 
[mikeda@cent svntest]$ svn diff ABC.txt 
 Index: ABC.txt
 ===================================================================
 --- ABC.txt	(リビジョン 1)
 +++ ABC.txt	(作業コピー)
 @@ -1 +1 @@
 -ABC
 +abc

レポジトリへコミットします。
コマンドはcommit(ciでもOK)です。

[mikeda@cent svntest]$ svn commit -m "to lower-case"
送信しています              ABC.txt
ファイルのデータを送信中です.
リビジョン 2 をコミットしました。

コミット前後など、要所要所でupdateを実行しましょう。作業コピーをレポジトリと同期します。

[mikeda@cent svntest]$ svn update
リビジョン 2 です。
[mikeda@cent svntest]$ svn log
                                                                                                                                              • -
r2 | mikeda | 2009-03-22 23:11:39 +0900 (日, 22 3月 2009) | 1 line to lower-case
                                                                                                                                              • -
r1 | mikeda | 2009-03-22 23:04:10 +0900 (日, 22 3月 2009) | 1 line import svntest
                                                                                                                                              • -

リモートからのチェックイン、コミット

SVNサーバの起動

今回はsvnserveを使います。svn+sshapacheを使う方法はまた今度。
TCPの3690番ポートで起動するので必要があればFW設定行ってください。

[mikeda@cent ~]$ svnserve --daemon --root /home/mikeda/repos
[mikeda@cent ~]$ /usr/sbin/lsof -i:3690
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE NODE NAME
svnserve 1640 mikeda    3u  IPv6 2005748       TCP *:svn (LISTEN)
アクセス制御設定

デフォルトだとリモートからコミットができないので設定を変えます。
設定ファイルはレポジトリの下のconfディレクトリにあります。

[mikeda@cent ~]$ cd /home/mikeda/repos/conf/
[mikeda@cent conf]$ ls
authz  passwd  svnserve.conf

読み取りはだれでも、書き込みは認証、認証設定はpasswdファイルからとします。
読み取りでも認証させるにはanon-accessのところを「read」から「none」にしてください。

[general]
anon-access = read
auth-access = write
password-db = passwd
  • passwd
[users]
mikeda = mike


準備が整ったのでリモートマシンからいろいろやってみましょう。

チェックアウト

URLはsvn:///svntest/trunkになります。
svnserveの起動時に「--root」で仮想ルートを設定したので/home/mikeda/reposは省略できます。

mini:~ mikeda$ cd work

mini:work mikeda$ svn co svn://cent/svntest/trunk svntest
A    svntest/ABC.txt
Checked out revision 2.
mini:work mikeda$ 
mini:work mikeda$ ls -a svntest/
.       ..      .svn    ABC.txt
mini:work mikeda$ cat svntest/ABC.txt 
abc
編集、コミット

今回は修正じゃなく、新しくファイルを追加してみましょう。(他はローカルと何も変わらないので・・・)

mini:work mikeda$ cd svntest/
mini:svntest mikeda$ echo CDE > CDE.txt
mini:svntest mikeda$ svn add CDE.txt 
A         CDE.txt


mini:svntest mikeda$ svn commit -m "add CDE.txt"
Authentication realm:  949d2141-9ed2-4f03-b8c1-0ad3e6d4c559
Password for 'mikeda': 
Sending        ABC.txt
Adding         CDE.txt
Transmitting file data ..
Committed revision 3.
mini:svntest mikeda$ svn update
At revision 3.


確認

mini:svntest mikeda$ svn update
At revision 3.
mini:svntest mikeda$ svn log
                                                                                                                                              • -
r3 | mikeda | 2009-03-22 23:34:29 +0900 (日, 22 3 2009) | 1 line add CDE.txt
                                                                                                                                              • -
r2 | mikeda | 2009-03-22 23:11:39 +0900 (日, 22 3 2009) | 1 line to lower-case
                                                                                                                                              • -
r1 | mikeda | 2009-03-22 23:04:10 +0900 (日, 22 3 2009) | 1 line import svntest
                                                                                                                                              • -