概要

CVSを使ってホームディレクトリ下のdotファイル等を管理する。

計画

ホームディレクトリ全体を対象にすると収集がつかなくなるので、一部のファイル/フォルダのみを対象とし、下記の通りに管理する。
  • CVSの管理対象とするファイルはフォルダ毎に整理し、~/cvs下にフォルダごと置く。---(A)
  • CVSへの登録は(A)のフォルダ単位で行う
  • (A)のフォルダ内のファイルを本来配置すべき場所には代わりにリンクを作成する---(B)
  • (B)のリンクの作成はシェルスクリプトにしておく

手順

1)準備

cvsサーバー側の詳細は省略。今回はクライアント側の説明のみ。cvs自体はデフォルトで入っているのでインストール不要。環境変数CVSROOTをサーバーにあわせて設定しておく。ssh接続するならCVS_RSHも忘れずに設定する。

~/.profileの記述例

# 実行ホストがCVSサーバーの場合のみローカルディレクトリを参照。
if [ `hostname` == "CVSサーバー名" ]; then
  export CVSROOT=/サーバー内の/フォルダ
else
  export CVSROOT=:ext:接続ユーザー名@CVSサーバーアドレス:/サーバー内の/フォルダ
  export CVS_RSH=ssh
fi;

2)管理対象とするファイル/フォルダをCVSに登録

ここでは、~/bin/内のファイルを管理対象にする、と仮定します。下記のコマンドでCVSサーバーに新規登録。今後はリポジトリ名でファイルをやりとりするので、後で思い出しやすい名前にしておく。ユーザ名とリリース名は適当。
cd ~/cvs/bin
cvs import -m "コメント" リポジトリ名(登録名) ユーザ名 リリース名
例) cvs import -m "~/bin added" home.bin bin1 start

3)~/cvs以下にcheckoutする

mkdir -p ~/cvs/
cd ~/cvs
cvs co home.bin
とりあえずこれでCVSに登録はできているのですが、~/bin/*と~/cvs/home.bin/*は名前は同じでも完全に別物です。

4)~/cvs/bin/*のリンクを~/binに作成する

下記のシェルスクリプトを作成し、実行権を与えておく。lncvs-home.bin.shを実行すると、~/cvs/home.bin/内のファイルへのリンクを~/binに作成します。~/bin内に同名ファイルがある場合は削除されますので注意。

~/bin/lncvs-home.bin.sh

#!/bin/sh
lndir.sh ~/cvs/home.bin/ ~/bin/

~/bin/lndir.sh

#!/bin/sh
##########
# define functions
# error print
ERROR_EXIT(){
		echo "usage: lndir.sh [-s|-h] fromdir todir"
		echo "lndir.sh make links recursively."
		echo "-s : symbolic link (default)"
		echo "-h : hard link"
		exit 2
}
# make links recursively
LINK_RECURSIVE(){
	for i in $1/.* $1/*; do
		SRC=$i
		DST=`echo $i | sed "s#$SRCBASE#$DSTBASE#"`
		NAME=`echo $i | sed 's#.*/##'`
		
		if [ -d $SRC -a $NAME != "CVS" -a $NAME != "." -a $NAME != ".." ]; then
			mkdir -p $DST
			LINK_RECURSIVE $i
		elif [ -f $SRC ]; then
#			if [ -e $DST ]; then rm $DST; fi
#			ln -s $SRC $DST
			$LN $SRC $DST
		fi;
		echo $SRC
	done
};
##########
# initialize
# getopt
args=`getopt sh $*`
LN="ln -fs "
if [ $? -ne 0 ]; then ERROR_EXIT; fi
set -- $args
for i; do
	case "$i" in
	-s)
		# symbolic link
		LN="ln -fs "
		shift;;
	-h)
		# hard link
		LN="ln -f "
		shift;;
	--)
		shift; break;;
	esac
done
# set global variables
if [ $# != 2 ]; then ERROR_EXIT; fi
SRCBASE=`echo $1 | sed 's#/$##'`
DSTBASE=`echo $2 | sed 's#/$##'`
if [ $SRCBASE = $DSTBASE -o ! -d $SRCBASE ]; then ERROR_EXIT; fi;
# debug print
#echo "1st:"$SRCBASE
#echo "2nd:"$DSTBASE
#echo $LN
#exit 1
##########
# main
LINK_RECURSIVE $SRCBASE
exit 0

5)home.bin回りの操作

  • 他の端末で同じファイルを使いたい
mkdir ~/cvs ~/bin
cd ~/cvs
cvs co home.bin
cp ~/cvs/home.bin/* ~/bin
~/bin/lncvs-home.bin.sh

  • 現在の状態をcvsサーバーに反映する
cd ~/cvs/home.bin
cvs ci

  • CVSサーバーの最新版を現在の端末に反映する
cd ~/cvs/home.bin
cvs up

  • 管理するファイルを追加する
cp 追加するファイル ~/cvs/home.bin/
cd ~/cvs/home.bin
cvs add 追加するファイル
cvs ci

6)ドットファイルの管理

基本的な作業は上記と一緒。うちでは~/cvs/home.dotを作成し、管理したいファイルだけをこの中に置いている。~/cvs/home.dot/内のファイルのリンクを~/に作成するのは次のスクリプトを使用。

~/bin/lncvs-home.dot.sh

#!/bin/sh
lndir.sh -h ~/cvs/home.dot/ ~/
chmod 710 ~/.fetchmailrc
chmod 600 ~/.ssh/*
chmod 700 ~/.[[mutt]]
chmod 700 ~/.resources
chmod 600 ~/.vnc/passwd
chmod 700 ~/.[[gaim]]
chmod 700 ~/.[[jpilot]]
こんな風に、パーミッション設定等を変更する作業もこのスクリプトの中に書き込んでおく。

メモ、注意事項

  • X11付属のlndirは使ってない。なんでだったっけかな。理由は忘れた。
  • リンク作成はソフトリンクの方が好き。CVSでの管理対象になってるかどうか分かりやすいから。

問題点、課題

  • もっとスマートな方法があるような気がしてならない。

最終更新:2007年01月12日 22:15