UbuntuをはじめとするUnixライクなOSでは、様々なシーンでテキストファイルを扱います。システムの起動に関わる処理はシェルスクリプトで記述されていますし、各種ソフトウェアの設定ファイルも多くがテキスト形式です。これらは簡単にテキストエディタで編集することができますが、編集前にバックアップを取っておくのが必須であることは言うまでもありません。
また場合によっては「特定のバージョンとの差分を取りたい」や「何世代前の状態に戻したい」という要求も発生するでしょう。しかしこのような場合、単純なファイルコピーによるバックアップでは対処が難しくなります。
今回はそのような場合に便利なバージョン管理ツールを紹介します。
RCSによるバージョン管理
Unix系のOSで古くから使われているのがRevision Control System(RCS)です。
Ubuntuではrcsパッケージとして提供されています。以下のコマンドを端末から打ち込むか、Synapticでrcsを検索してシステムへインストールを行ってください。
RCSはファイルのバージョン管理用のファイル(拡張子は,vとなります。カンマであることに気をつけてください)を管理対象のファイルと同じディレクトリに作成します。そのためディレクトリが煩雑になりがちですが、"RCS"という名前のサブディレクトリを作成しておくことにより、管理ファイルをこのディレクトリにまとめて置くことができます。
例として、以下のC言語のソースコードをhello.cとして保存します。
作成したソースコードを、バージョン管理下にチェックインします。チェックインにはciコマンドを使用します。
ログメッセージの入力が促されますので、どのような変更を行ったかを記述してください。先頭にピリオドだけの行を入力することで、入力を終了することができます。なお今回は初回のバージョンですので気にする事はありませんが、ソースコードの変更箇所は後述するようにdiffで簡単に調べることができますので、ログには「何故そのような変更を行ったか」という理由を記述しておくことがバージョン管理のコツです。
チェックインが完了すると、RCSディレクトリ内にhello.c,vファイルが作成され、hello.c本体は削除されてしまいます。チェックインするファイルを削除したくない場合はciコマンドに-uオプションを指定してください。これはチェックインした直後にファイルをロックせずチェックアウト(後述)する動作と同じことを行います。
バージョン管理下にあるファイルを参照したい場合は、チェックアウトを行います。以下のコマンドを端末から実行してください。
先ほどチェックインしたhello.cのリビジョン1.1が読み込み専用で取り出されます。この状態では編集ができませんので、ファイルを編集したい場合はチェックアウト時にロックを行う必要があります。ロックをするには、coコマンドに-lオプションをつけて実行してください。
チェックアウトが出来たら、ソース内の文字列を以下のように書き換えて再度チェックインを行ってください。hello.cのリビジョン1.2としてチェックインが行われます。
リビジョン間の差分を取るにはrcsdiffコマンドを使用します。最初にチェックインしたhello.cと、編集後にチェックインしたhello.cの差分を取るには以下のコマンドのように、-rオプションにリビジョンを指定します。
リビジョン1.2のチェックイン後に、リビジョン1.1を再度取得したくなった場合は、coコマンドにリビジョンを指定してチェックアウトを行います。
このようにバージョン管理ツールを使用することで、ファイルの変更履歴を残すことができ、バージョン間の差分の取得や古いバージョンの取得を簡単に行うことができます。
システムに関わるファイルを変更するような場合は、バージョン管理を行っておくとよいでしょう。
Subversionによるバージョン管理
RCSは非常に手軽で便利なツールですが、複数のファイル、例えば複数のHTMLファイルからなるWebサイトや、多数のソースコードからなるアプリケーションのプロジェクト等を管理するには適しているとは言えません。そのような場合はもう少し高機能なバージョン管理ツールを使用するのがよいでしょう。ここでは比較的メジャーなバージョン管理ツールとして、Subversionを紹介します。
Subversionはsubversionパッケージで提供されていますので、使用するためにはsubversionパッケージをインストールする必要があります。このパッケージにはSubversionのサーバとしての機能と、サーバにアクセスするためのコマンドの両方が含まれています。
Subversionではデータの置き場として「リポジトリ」を作成する必要があります。リポジトリの管理を行うためのコマンドがsvnadminです。以下の例ではユーザのホームディレクトリにsvnというディレクトリを作成し、その中にtest-repoというリポジトリを作成しています。
リポジトリの作成が出来たら、作業を行うためにチェックアウトを行います。
ホームディレクトリにworkというディレクトリを作成し、その中にリポジトリをチェックアウトします。このチェックアウトしたディレクトリを「作業コピー」と呼びます。
前述のhello.cを作業コピー(ここでは/home/mizuno/work/test-repo)に配置しましょう。新しいファイルを追加したら、以下のコマンドでSubversionにファイルの追加を知らせます。
作業が一通り完了したら、変更をリポジトリに適用(コミット)します。
環境変数EDITORに指定したエディタが起動し、コミットログの入力を促されます。ログを入力してエディタを終了すると、コミットは完了です。
ネットワーク経由でSubversionを使う
Subversionはネットワークを経由して各種操作を行うことができます。そのためにはリポジトリを作成したマシンがSubversionのサーバとして動作するようセットアップする必要がありますが、ここでは最も簡単だと思われるsshを経由する方法を紹介します。
手順としては、サーバにopenssh-serverパッケージをインストールし、ユーザがsshでログインできるようにするだけです。既にsshでのログインが可能な状態になっているのであれば、特に設定は必要ありません。
前述の例ではローカルのリポジトリにアクセスするためfile://スキーマを使用してリポジトリを指定しましたが、sshを経由する場合はsvn+ssh://スキーマを使用します。またリポジトリの位置はルートからのフルパスで指定する必要があります。
筆者はファイルサーバ上にリポジトリを作成し、ホームディレクトリ以下に置く設定ファイル(.emacsや.zshrcなど)をバージョン管理しています。各マシンでホームディレクトリに設定ファイルをチェックアウトし、変更があったらコミットし、他のマシンではアップデート(svn upコマンド)を行う...という運用をしています。
Subversionについて詳しく調べるにはSubversion によるバージョン管理のページなどが参考になるでしょう。
GUIからSubversionを使う
前述の操作は全て端末から行うことを想定していますが、GUIのSubversionクライアントソフトも存在します。有名なクライアントソフトは数種存在しますが、ここではRapidSVNを紹介します。Synapticやapt-getでrapidsvnパッケージをインストールしてください。
リポジトリを読み込むには、Bookmarksを右クリックして"Checkout New Working Copy"を実行します。以下のようなダイアログが表示されますので、リポジトリのアドレスとチェックアウトする作業コピーの場所を入力してください。
詳細はメニューのHelpから開けるオンラインヘルプを参照してください。
etckeeper
/etc以下のファイル群は、どれもシステム全体の動作に影響を与える重要な設定ファイルです。etckeeperを導入することで、これら/etc以下全体をバージョン管理下に置くことができます。apt-getやSynapticからetckeeperパッケージをインストールしてください。
etckeeperを使い始める前に、設定ファイルを編集する必要があります。/etc/etckeeper/etckeeper.confをテキストエディタで開いてください。
ファイルの先頭に、バックエンドで使用するバージョン管理ツールを指定する部分があります。etckeeperのインストール時にgitがインストールされているはずですので、ここではgitを指定します。
なおetckeeperはgitの他に、mercurialやbazzarをバックエンドに使用することもできます。
設定ファイルの編集が完了したら、以下のコマンドを実行してリポジトリを初期化した後、最初のバージョンをコミットしましょう。
RCSやSubversion同様、コミットログの入力を求められます。コミットログを入力してエディタを終了すれば、ファイルのコミットは完了です。
以降は /etc 以下のファイルを編集する度にコミットを行ってください。なおシステムが自動的に書き換える可能性のあるファイルはバージョン管理下にはおかれませんので、注意してください。
詳しくはetckeeperのマニュアル(/usr/share/doc/etckeeper/README)を参照してください。