開発
Dotfiles を Git で効率よく管理する
Taro Aoki
こんにちは、アルバイトの青木です。最近は君の名は。にハマりすぎて聖地巡礼とかしていました。
それはさておき、皆さんは dotfiles の管理はどのようにしているでしょうか?
そもそも dotfiles ってなんぞや
Dotfiles というのは名前の通りファイル名の先頭にドットが付くファイル群のことです。
ファイル名の先頭にドットを付けると Linux などでは隠しファイルとして扱われるため、dotfiles は各ソフトウェア・ミドルウェアの設定を記述するのに使われたりすることが多いです。
よく目にするものだと、”.bashrc” や “.zshrc”、”.vimrc” などが挙げられます。ターミナルをよく利用するならば日常的に触っている人も多いかと思います。
複数の環境下での問題
例えば自身の別のコンピュータや仮想マシン、大学のワークステーションを利用する際、普段使っている環境と異なっていると非常に使いづらいと感じるかと思います。
そんなとき、普段の環境に合わせようと再度設定をすることもできますが、非常に手間がかかりますし、面倒です。
Dotfiles を Git で管理する
そこで、それらの dotfiles を Git によって管理してみましょう。
ローカルリポジトリへ dotfiles を移動して、代わりに元の場所にはそのファイルのシンボリックリンクを貼ります。
そうすることで dotfiles を Git で管理しながら以前と変わらない設定を維持することができます。
GitHub や Bitbucket を利用したり、自分で GitLab を立てたりしてリモートリポジトリへと push しておけば、別環境でも git clone するだけで、dotfiles を持ってくることができて便利です。
もう一つメリットとして、Git で管理するということはバージョン管理ができるということでもあるので、気軽に変更を加えやすいという点があります。
もう少し便利に…
こうして dotfiles を管理することができましたが、新しい環境に dotfiles を適用させるには自分でシンボリックリンクを貼らないといけません。
これはかなり面倒なので適当にスクリプトを書きましょう。
#! /bin/sh
DOTPATH=$HOME/dotfiles
echo "\$DOTPATH : $DOTPATH"
echo "Created dotfile symbolic links."
for f in .??*
do
# Exclude files
if [ "$f" = ".git" ] || [ "$f" = ".gitignore" ];then
continue
fi
ln -sf "$DOTPATH"/"$f" "$HOME"/"$f"
if [ $? -eq 0 ]; then
printf " %-25s -> %s\n" "\$DOTPATH/$f" "\$HOME/$f"
fi
done
echo ""
このスクリプトを実行すると以下のようになります。
Make を使ってみる
Make の本来の使い方とはちょっと異なる気もしますが、Make をラッパーとして使うと処理を簡潔にできます。
help: aa
@echo "make all -- Install all environment settings"
@echo "make update -- Do update dotfiles by git repository"
all: aa
@./bin/init.sh
aa:
@./bin/aa.sh
update:
@./bin/update.sh
./bin以下に先程のスクリプトを配置すれば、”make <target>” で処理ができます。
終わりに
これでだいぶ楽に dotfiles を管理することができるようになりました。
ただ、いくつか課題もあって、最小限の設定だけ適用したい場合(そのマシンでは使わないソフトウェアの設定ファイルを入れたくない場合)は少し面倒になってしまいます。
submodule を使うのが良いのかなぁとか思いますが、まだ自分も試行錯誤中なので良い解決策があったら教えてください!
参考
http://qiita.com/b4b4r07/items/b70178e021bef12cd4a2