Ubuntu Weekly Recipe

第58回 ファイルのバージョンを管理する

この記事を読むのに必要な時間:およそ 3 分

UbuntuをはじめとするUnixライクなOSでは,様々なシーンでテキストファイルを扱います。システムの起動に関わる処理はシェルスクリプトで記述されていますし,各種ソフトウェアの設定ファイルも多くがテキスト形式です。これらは簡単にテキストエディタで編集することができますが,編集前にバックアップを取っておくのが必須であることは言うまでもありません。

また場合によっては「特定のバージョンとの差分を取りたい」「何世代前の状態に戻したい」という要求も発生するでしょう。しかしこのような場合,単純なファイルコピーによるバックアップでは対処が難しくなります。

今回はそのような場合に便利なバージョン管理ツールを紹介します。

RCSによるバージョン管理

Unix系のOSで古くから使われているのがRevision Control System(RCS)です。

Ubuntuではrcsパッケージとして提供されています。以下のコマンドを端末から打ち込むか,Synapticでrcsを検索してシステムへインストールを行ってください。

$ sudo apt-get install rcs

RCSはファイルのバージョン管理用のファイル(拡張子は,vとなります。カンマであることに気をつけてください)を管理対象のファイルと同じディレクトリに作成します。そのためディレクトリが煩雑になりがちですが,"RCS"という名前のサブディレクトリを作成しておくことにより,管理ファイルをこのディレクトリにまとめて置くことができます。

$ mkdir RCS

例として,以下のC言語のソースコードをhello.cとして保存します。

#include <stdio.h>

int main()
{
    puts("hello");
    return 0;
}

作成したソースコードを,バージョン管理下にチェックインします。チェックインにはciコマンドを使用します。

$ ci hello.c

ログメッセージの入力が促されますので,どのような変更を行ったかを記述してください。先頭にピリオドだけの行を入力することで,入力を終了することができます。なお今回は初回のバージョンですので気にする事はありませんが,ソースコードの変更箇所は後述するようにdiffで簡単に調べることができますので,ログには「何故そのような変更を行ったか」という理由を記述しておくことがバージョン管理のコツです。

チェックインが完了すると,RCSディレクトリ内にhello.c,vファイルが作成され,hello.c本体は削除されてしまいます。チェックインするファイルを削除したくない場合はciコマンドに-uオプションを指定してください。これはチェックインした直後にファイルをロックせずチェックアウト(後述)する動作と同じことを行います。

バージョン管理下にあるファイルを参照したい場合は,チェックアウトを行います。以下のコマンドを端末から実行してください。

$ co hello.c

先ほどチェックインしたhello.cのリビジョン1.1が読み込み専用で取り出されます。この状態では編集ができませんので,ファイルを編集したい場合はチェックアウト時にロックを行う必要があります。ロックをするには,coコマンドに-lオプションをつけて実行してください。

チェックアウトが出来たら,ソース内の文字列を以下のように書き換えて再度チェックインを行ってください。hello.cのリビジョン1.2としてチェックインが行われます。

    puts("hoge"); # 出力する文字を変更

リビジョン間の差分を取るにはrcsdiffコマンドを使用します。最初にチェックインしたhello.cと,編集後にチェックインしたhello.cの差分を取るには以下のコマンドのように,-rオプションにリビジョンを指定します。

$ rcsdiff -r1.1 -r1.2 hello.c
===================================================================
RCS file: RCS/hello.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -r1.1 -r1.2
5c5
<   puts("hello");
---
>   puts("hoge");

リビジョン1.2のチェックイン後に,リビジョン1.1を再度取得したくなった場合は,coコマンドにリビジョンを指定してチェックアウトを行います。

$ co -r1.1 hello.c
$ cat hello.c
(...略...)
    puts("hello");
(...略...)

このようにバージョン管理ツールを使用することで,ファイルの変更履歴を残すことができ,バージョン間の差分の取得や古いバージョンの取得を簡単に行うことができます。

システムに関わるファイルを変更するような場合は,バージョン管理を行っておくとよいでしょう。

Subversionによるバージョン管理

RCSは非常に手軽で便利なツールですが,複数のファイル,例えば複数のHTMLファイルからなるWebサイトや,多数のソースコードからなるアプリケーションのプロジェクト等を管理するには適しているとは言えません。そのような場合はもう少し高機能なバージョン管理ツールを使用するのがよいでしょう。ここでは比較的メジャーなバージョン管理ツールとして,Subversionを紹介します。

Subversionはsubversionパッケージで提供されていますので,使用するためにはsubversionパッケージをインストールする必要があります。このパッケージにはSubversionのサーバとしての機能と,サーバにアクセスするためのコマンドの両方が含まれています。

Subversionではデータの置き場として「リポジトリ」を作成する必要があります。リポジトリの管理を行うためのコマンドがsvnadminです。以下の例ではユーザのホームディレクトリにsvnというディレクトリを作成し,その中にtest-repoというリポジトリを作成しています。

$ cd
$ mkdir svn
$ cd svn
$ svnadmin create test-repo

リポジトリの作成が出来たら,作業を行うためにチェックアウトを行います。

ホームディレクトリにworkというディレクトリを作成し,その中にリポジトリをチェックアウトします。このチェックアウトしたディレクトリを「作業コピー」と呼びます。

$ cd
$ mkdir work
$ svn co file:///home/mizuno/svn/test-repo

前述のhello.cを作業コピー(ここでは/home/mizuno/work/test-repo)に配置しましょう。新しいファイルを追加したら,以下のコマンドでSubversionにファイルの追加を知らせます。

$ svn add hello.c

作業が一通り完了したら,変更をリポジトリに適用(コミット)します。

$ svn commit

環境変数EDITORに指定したエディタが起動し,コミットログの入力を促されます。ログを入力してエディタを終了すると,コミットは完了です。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入