概要
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
cd ~/cvs/home.bin
cvs ci
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