Edited at
GitDay 9

dotfiles (設定ファイル)の管理に git submodule を使う

More than 3 years have passed since last update.

こんにちは @sonots です。今回わたしは git submodule の使いどころの一例として dotfiles (設定ファイル)の管理への応用を紹介してみようと思います。


まえおき. dotfiles の管理に git を使う

自分の dotifles (設定ファイル)を github のリポジトリに登録して、新しい環境でも git clone すれば簡単に環境構築できるようにしている方って、最近ではけっこういらっしゃるのではないでしょうか?そういう私も

https://github.com/sonots/.dotfiles

で設定ファイルを管理をするようにしていて、新環境へのインストールはこちらの gist https://gist.github.com/4239842 に書いたスクリプトを

curl https://raw.github.com/gist/4239842/dotfiles.sh | sh

のように実行してインストールできるようにしています。中でやっているのは git clone と設定ファイルへのシンボリックリンク作成ですね。

設定ファイルをいじった時も手元の環境で git push しておき、他の環境で git pull --rebase すれば配布ができるので、非常に捗ります。


本題. dotfiles の管理に git submodule を使う

dotfiles (設定ファイル)の管理をしようと思うと、他の方が書いて公開してくださっている zsh plugin だとか vim plugin だとかを使いたくなることがありますよね。

そんなときにオススメしたいのが git submodule を利用した dotfiles の管理です。


git submodule とは

git submodule は、外部の git リポジトリを、自分の git リポジトリソースツリーのサブディレクトリとして登録する仕組みです。

リビジョン番号も登録されるので、バージョンを固定化するのにも使えます。


簡単に使い方を紹介

git submodule add で外部リポジトリをサブモジュールとして登録できます。たとえば、vimmer の方なら皆使っているであろう vim の plugin マネージャーである vundle を submodule として登録してみます。

git submodule add http://github.com/gmarik/vundle.git .vim/vundle.git

submodule を登録すると、.gitmodules ファイル(なければ作られる)に以下のような変更が加えられます。

[submodule ".vim/vundle.git"]

path = .vim/vundle.git
url = http://github.com/gmarik/vundle.git

これで登録は完了しているので、git commit && git push しておいてあげましょう。

上記の例では直接、公開されているレポジトリを submodule として登録しましたが、私自身は fork した github の自分のポジトリを submodule として登録するようにしています。魔改造をしたくなることがけっこうあるので ^ ^;

submodule 内の変更は、その submodule ディレクトリ内で git commit && git push する形になります。

※ git submodule の微妙な所その1なのですが、git submodule には削除コマンドが用意されていないです。単に git rm -rf などして削除するとおかしな感じになるので、例えばこちらのサイト http://d.hatena.ne.jp/oppara/20101116/p1 などを参考に削除していただければと思います。


git clone した場合の反映方法

これがまたちょっと git submodule の微妙な所その2なのですが、

git clone https://github.com/sonots/.dotfiles.git ~/.dotfiles

のように git clone しただけでは、まだ submodule の内容は取得されません。その後に

cd ~/.dotifiles

git submodule init
git submodule update

としてやっと submodule の内容を clone することができます。これがやり方を忘れがちで面倒くさいのですが、dotfiles (設定ファイル)のインストールスクリプトにそれを書いてしまえばOKです。私は書くようにしました。https://gist.github.com/4239842

これで、インストールスクリプトを実行すれば、zsh plugin や vim plugin (このタイミングでは vundle しか入れてませんが) などもインストールされるようになって捗るようになりました。


まとめ

というわけで、git submodule はちょっと癖があって使いづらいのですが、dotfiles (設定ファイル)の管理に使ってみたら、それなりに便利に使えたので、紹介してみました。

というか、これ以外に git submodule の使いどころを見出せていない自分がいます ^ ^;


追記: git submodule cheat sheet

リンク貼っておきますね git submodule cheat sheet - sonots:blog