バージョン管理をしてみよう

開発環境が整ったので早速プログラミングを……といきたいところですが、折角ですからソースコードのバージョン管理をしましょう。Ubuntu には Subversion というバージョン管理ツールが用意されているので、これをインストールします。ちなみに Emerald の非 GPL テーマを取得する際に Subversion が必要ですので、Emerald を使っている人は既にインストールされてるかもしれません。subversion パッケージにはクライアントソフトと一緒にリポジトリ作成やサーバプログラムも同梱されてますので、それだけで自分のリポジトリを作ることができます。

$ sudo apt-get install subversion

まずリポジトリを作成するディレクトリを用意します。今回は自分だけのリポジトリということでホームに作っちゃいます。

$ mkdir ~/svn
$ svnadmin create ~/svn/project

~/svnsvnserve の管理するディレクトリ、project が今回作成したプロジェクトのリポジトリということになります。リポジトリにはお約束であるべきディレクトリというものがあります。それを追加してみましょう。

$ svn mkdir file:///home/`whoami`/svn/project/trunk file:///home/`whoami`/svn/project/trunk/src file:///home/`whoami`/svn/project/trunk/doc file:///home/`whoami`/svn/project/tags file:///home/`whoami`/svn/project/branches

リポジトリにアクセスするのに file:// スキームを使っていますが、これは svn のサーバプログラムを経由せずにローカルのファイルへアクセスしていると考えてください。そのためルートディレクトリからのフルパスが必要になります。また svnserve をデーモンとして起動させている場合は svn:// スキームでアクセスすることができます。この場合は svnserve が起動時にサーバのルートとなるディレクトリを指定されているため、リポジトリ名のみでアクセスすることになります。*1
リポジトリディレクトリを作成するとエディタが立ち上がるので、コミットログを書き込みます。「最初のバージョン」とか適当なログを書いておきましょう。早速作ったリポジトリを見てみます。ディレクトリが作成されてますね。

$ svn ls file:///home/`whoami`/svn/project
branches/
tags/
trunk/

さて、それではプログラムを書いていきましょう。そのためにはまずリポジトリの作業コピーを作る必要があります。作業用のディレクトリは ~/work とでもしましょう。そこに project をチェックアウトします。

$ mkdir ~/work
$ svn co file:///home/`whoami`/svn/project ~/work/project

~/work 以下に project ディレクトリが作成されて、リポジトリの中身がコピーされます。ソースコードは trunk/src に追加することにしましょう。エディタでがりがりとプログラムを書いたことにします。そして新しいファイルができたら追加です。

$ cd ~/work/project/trunk/src
$ svn add main.h main.c

main.c と main.h が作業コピーに追加されました。これをリポジトリにコミットします。-m オプションはコミットログを指定します。こうやって指定するといちいちエディタが起動しないので手っ取り早いのです。

$ svn commit -m 'main.c と main.h を追加した'
追加しています src/main.c
追加しています src/main.h
ファイルのデータを送信しています ..
リビジョン 2 をコミットしました。

はい、完了です。こうやってコミットする度に変更履歴が差分としてリポジトリに蓄積されていきます。テキストデータならどんなものでもすぐに diff を取ることができますので、プログラムに限らず TeX や HTML などにも使えます。
手元でバージョン管理をするならこれでよいのですが、折角ですからネットワーク越しにチェックアウト、コミットができるようにしましょう。svnserve をデーモンとして起動して待ち受け……が基本なのですが、リポジトリのアクセス権限設定やら、そもそも svnserve自動起動も自分で設定しないといけないわ*2で面倒くさいです。ですのでここは ssh に処理を丸投げすることにしちゃいましょう。通信路の安全も保ててお得です。
既に ssh でリモートログインが出来るならば何もすることはありません。

$ svn ls svn+ssh://home/`whoami`/svn/project

svn+ssh:// スキームを使ってアクセスするだけです。またアクセスするパスはルートからのフルパスになります。当然ですが ssh でログインするアカウントが、リポジトリディレクトリにアクセス権限がある必要があります。

*1:svnserve -d -r /home/`whoami`/svn で起動した場合は svn://localhost/project でアクセスできる

*2:だと思う