footmark

ひよっこエンジニアの足跡

GitHubでdotfilesを管理する

先週も書きましたが、dotfilesをGitHubで管理し始めました。

dotfilesってなに

.vimrc.zshrc など .ほにゃらら なファイルの総称です。
そう、設定ファイル。

GitHubでdotfilesを管理する

手元のマシンを1回設定するだけならまだしも(それでもしんどい)、仮想環境やらサーバやらで同じ作業を何回もするのは嫌だ!構築・保守を簡単に!という要望に答える手段の一つが、GitHubでの管理

やることはシンプルで、

  1. dotfiles ディレクトリ(別に何でも構わない)を作る
  2. dotfiles ディレクトリにGitHubで管理したいdotfileを入れる
  3. シンボリックリンクを貼る

です。
シンボリックリンクを一括で貼るシェルスクリプトなんかを dotfiles ディレクトリに含めておくといいと思います。

例えば、こんな感じ。

install.sh
ln -sf ~/dotfiles/.vimrc ~/.vimrc
ln -snf ~/dotfiles/.vim ~/.vim

まあ、詰まる

ここから詰まったことを3つほど。
何事もそんなうまくは行かない。

循環参照ができてしまった

循環参照っていうのは参照先が参照元を指すことです。
例えば、循環参照を黙々と潜って行くと、
dotfiles/.vim/.vim/.vim/.vim/.vim
みたいな感じになります。

これ(循環参照)、できない方がいいと思うんですが、先のシンボリックリンクを作るとき、ディレクトリへのシンボリックリンクに対して n オプションを付けずに実行すると循環参照が生まれました。

# ディレクトリへのシンボリックリンクに対してnオプションなし
ln -sf ~/dotfiles/.vim ~/.vim

付けましょう、n オプション。

参考

Gitリポジトリの中でGitリポジトリの管理ってどうやるの?

これ、知りませんでした。

プラグインなんかを扱っていると、dotfiles リポジトリの中にGitリポジトリが入ってくると思います。
ですがこれをそのまま push しても「Gitリポジトリです」みたいなアイコンの開けないディレクトリがあがるだけです。
そしてこれを clone しても空のディレクトリが作成されるだけ。

自分で clone すれば解決ですが、それじゃあ楽になりません。

これを解決する方法の一つは git submodule を使うです。

git submodule は癖が強いとかなんとか聞きますが、git submodule しか使ったことがないのでよく分かりません。

git submoduleの使い方

dotfiles ディレクトリ内で

git submodule add [追加したいリモートリポジトリのURL] [ローカルリポジトリのパス]

を叩くと、.gitmodules ファイルと .git/modules ディレクトリにsubmoduleの情報が書き込まれます。

submoduleが管理するのは submoduleに設定したGitリポジトリが現在どのコミットを指しているか です。

これらの情報をdotfiles リポジトリでコミットし、リモートリポジトリにもあげておきます。

clone 後は dotfiles リポジトリ

$ git submodule init
$ git submodule update

を叩くことにより、dotfiles リポジトリで指定されているコミットが設定・pull されます。

submoduleで管理しているGitリポジトリに変更を加えたい

ブランチ切って変更すればいいんじゃね?と思いましたが、管理するリモートリポジトリが存在しないため、clone して新しく環境を作ろうとしたときに困ります。

そこで、submoduleで管理している(しようとしている)GitリポジトリをForkし、それをsubmoduleで管理します(ややこしい)。

Forkってこうやって使うのかと学びました。

僕のdotfiles

そんなこんなで作ったdotfilesがこちらです。

yukimine/dotfiles