ドットファイルをsubversionで管理する

文:Vincent Danen(TechRepublic) 翻訳校正:石橋啓一郎
2009-07-03 08:00:00
  • このエントリーをはてなブックマークに追加

 私のような人であれば、さまざまなコマンドラインプログラムをカスタマイズした設定ファイルを持っているだろうと思う。~/.zshrcや~/.vimrcなどの設定ファイルは、「ドットファイル」と呼ばれる。2つ以上のコンピュータを使っている人は、おそらくその多くでこれらのドットファイルを再利用していることだろう。残念ながら、このことはドットファイルの管理という新たな問題を生み出す可能性があり、それらのファイルを異なるシステム間で最新のものに維持するのは難しい問題になり得る。特に、大量のコンピュータを使っている場合はそうだろう。

 1つの解決法は、これらのファイルの管理に、subversion、CVS、gitなどのバージョンコントロールの仕組みを使うことだ。この問題は、これらのファイルを保管するsubversionのレポジトリを作ることで簡単に解決できる。たとえば、他のシステムから(たとえばsshなどで)アクセスできる「マスター」システム上で、それらのファイルを保管するレポジトリを作成すればよい。そのレポジトリのコピーに~/svn/configsというディレクトリを作っておき、その下にドットファイルの種類ごとに、~/svn/configs/zsh、~/svn/configs/procmail、~/svn/configs/zshなどのサブディレクトリを作っておくという方法もあるだろう。

 subversionを使って、他のコンピュータへのこれらのファイルの配布するという手法はうまくいくのだが、配布されたファイルをコピーして最新のものに保っておくのは、やや面倒かも知れない。これを解決するために、実際のドットファイルを実際のファイルへのシンボリックリンクにしておいてもいいだろう。たとえば、~/.zshrcを~/svn/configs/zsh/zshrcへのシンボリックリンクにしておくというやり方だ。

 もう1つの方法は、標準的な「make」コマンドを使ってこれらを管理するというものだ。このソリューションは最初の設定にはやや時間がかかるが、この作業は1回やれば済む(そしてそれ以降は、新しいドットファイルの更新を簡単にしてくれる)。以下に示すのは、最新のコピーを収めたディレクトリの最上位ディレクトリ(たとえば~/svn/configs/Makefile)に置くMakefileの例だ。

# Makefile to update dot-files

# $Id$

ifndef SRCDIR

SRCDIR := $(shell pwd)

endif

DOTDIRS = $(shell find . -type d -depth 1 \! -name .svn | cut -d ‘/’ -f 2 )

REPO_FETCHMAILRC = $(SRCDIR)/fetchmail/fetchmailrc

LOCAL_FETCHMAILRC = $(HOME)/.fetchmailrc

REPO_ZSHRC = $(SRCDIR)/zsh/zshrc

REPO_ZSHENV = $(SRCDIR)/zshenv

REPO_ZSH_HOSTS = $(SRCDIR)/zsh_hosts

LOCAL_ZSHRC = $(HOME)/.zshrc

LOCAL_ZSHENV = $(HOME)/.zshenv

LOCAL_ZSH_HOSTS = $(HOME)/.zsh_hosts

.PHONY: fetchmail zsh

fetchmail:

@test -d $(SRCDIR)/fetchmail || ( echo “fetchmail sourcedir does not exist!” ; exit 1 )

cp -afv $(REPO_FETCHMAILRC) $(LOCAL_FETCHMAILRC)

fetchmail-diff:

@test -d $(SRCDIR)/fetchmail || ( echo “fetchmail sourcedir does not exist!” ; exit 1 )

@diff -uN $(REPO_FETCHMAILRC) $(LOCAL_FETCHMAILRC) || ( echo “”)

fetchmail-commit:

@test -d $(SRCDIR)/fetchmail || ( echo “fetchmail sourcedir does not exist!” ; exit 1 )

svn commit $(SRCDIR)/fetchmail

fetchmail-updaterepo:

@test -d $(SRCDIR)/fetchmail || ( echo “fetchmail sourcedir does not exist!” ; exit 1 )

cp -afv $(LOCAL_FETCHMAILRC) $(REPO_FETCHMAILRC)

zsh:

@test -d $(SRCDIR)/zsh || ( echo “zsh sourcedir does not exist!” ; exit 1 )

cp -afv $(REPO_ZSHRC) $(LOCAL_ZSHRC)

cp -afv $(REPO_ZSHENV) $(LOCAL_ZSHENV)

cp -afv $(REPO_ZSH_HOSTS) $(LOCAL_ZSH_HOSTS)

zsh-diff:

@test -d $(SRCDIR)/zsh || ( echo “zsh sourcedir does not exist!” ; exit 1 )

@diff -uN $(REPO_ZSHRC) $(LOCAL_ZSHRC) || ( echo “”)

@diff -uN $(REPO_ZSHENV) $(LOCAL_ZSHENV) || ( echo “”)

@diff -uN $(REPO_ZSH_HOSTS) $(LOCAL_ZSH_HOSTS) || ( echo “”)

zsh-commit:

@test -d $(SRCDIR)/zsh || ( echo “zsh sourcedir does not exist!” ; exit 1 )

svn commit $(SRCDIR)/zsh

zsh-updaterepo:

@test -d $(SRCDIR)/zsh || ( echo “zsh sourcedir does not exist!” ; exit 1 )

cp -fv $(LOCAL_ZSHRC) $(REPO_ZSHRC)

cp -fv $(LOCAL_ZSHENV) $(REPO_ZSHENV)

cp -fv $(LOCAL_ZSH_HOSTS) $(REPO_ZSH_HOSTS)

install: fetchmail zsh

diff: fetchmail-diff zsh-diff

commit: fetchmail-commit zsh-commit

updaterepo: fetchmail-updaterepo zsh-updaterepo

help:

@echo “Usage: make ”

@echo “Available targets are:”

@echo “help                          Show this text”

@echo “install                       Install all dotfiles”

@echo “diff                          Diff all dotfiles”

@echo “updaterepo                    Update repository from local dotfiles”

@echo “”

@echo “The following dotfiles are available for use with the below commands:”

@echo “   $(DOTDIRS)”

@echo “”

@echo “[dotfile]-install             Install [dotfile] configs”

@echo “[dotfile]-diff                Diff local [dotfile] configs to that in repository working copy”

@echo “[dotfile]-commit              Commit [dotfile] from working copy to repository”

@echo “[dotfile]-updaterepo          Update working copy for [dotfile] from local files”

 このMakefileではzshとfetchfileを扱っており、さまざまな機能を持っている(コマンドについて知りたければ、「make help」を使って欲しい)。これを使えば、「make install」コマンドや「make diff」コマンドを使うことで、すべてのドットファイルを一度に処理できる。あるいは、「make zsh-install」「make fetchmail-commit」などとすることで、個別のドットファイルについて操作することもできる。もちろん、このMakefileはsubversionを使うことを前提としており、~/svn/configs/ディレクトリ(あるいはこのファイルがインストールされている場所)から操作することを仮定している。

 REPO_*変数とLOCAL_*変数は、さまざまなドットファイルへのポインタとなっており、Makefileを書く際のタイプ量を減らすために設けられている。このMakefileは読めば内容がわかるようになっており、他のファイルに合わせたカスタマイズも簡単にできる。動的な割り当てを行い、Makefileのサイズと複雑さを減らすもっと効率的な方法もあるかもしれない。こうすれば改善できるという意見のある人は、コメント欄で共有して欲しい。

この記事は海外CBS Interactive発の記事をシーネットネットワークスジャパン編集部が日本向けに編集したものです。 原文へ

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]