homeshickとgit submoduleコマンドでプラグインも含めたドットファイルを全て管理する


## 概要
この記事はLinuxやOS Xで利用する環境設定ファイルをGitHubで管理する方法です。
さまざまなプラグインも`git submodule`コマンドで外部参照リポジトリとして管理します。
これを行なっておけば、オンライン環境下ならばどこでもいつでも同じような環境が手に入ります。
シンボリックリンク貼るの大変。。。という解決策として、homeshickを利用します。

## はじめに
Githubにdotfilesリポジトリを作成、各種環境設定ファイルを登録している方も多いと思います。
「でもプラグインとか他人のリポジトリのファイルを自分のリポジトリにコピペするのは気持ち悪いし、ライセンス的にも怖い」って思っている方、正しいです。
そしてGitはそれを解決できます。ドットファイル管理を行なっていて、プラグイン管理について知りたいだけの方は、次のQiita記事を見ていただければ十分です。

dotfiles (設定ファイル)の管理に git submodule を使う
http://qiita.com/sonots/items/adae6cda0bb7a05f8905


### ドットファイル？
UNIXやMacなどのOS環境では`$HOME`以下にドットから始まるファイルを置くことでユーザー独自の環境設定が出来ます。
黒い画面のくせにカラフルな人、Vimなのに関数ジャンプしている人は他人に見えない隠しファイルでズルしているのですね（）

### homeshick?
homeshickはシェルスクリプトベースで動く自動でリポジトリ内の設定ファイルのシンボリックリンクを`$HOME`に貼ってくれるスクリプトです。
homesickというほぼ同機能のスクリプトも存在するのですがRubyベースなので、私は準備が少なくてよいhomeshick使っています。

## homeshickの準備
homeshick自体は4コマンドほどで準備出来ます。

```console
$git clone git://github.com/andsens/homeshick.git ~/.homesick/repos/homeshick
$printf '\nsource "$HOME/.homesick/repos/homeshick/homeshick.sh"' >> $HOME/.bashrc
$printf '\nsource "$HOME/.homesick/repos/homeshick/completions/homeshick-completion.bash"' >> $HOME/.bashrc
$source ~/.bashrc 
```
ディレクトリ名が`.homesick`なのは、homesickとhomeshickがクローン関係であり、homesickの方が先輩ということですね。
zshなど利用している方は、当然`.bashrc`を`.zshrc`などに置き換えてください。

## dotfilesリポジトリを作る！
めんどくさいことはしたくないので、リポジトリはWeb GUIで作っておきます。(๑╹ڡ╹๑)

ここで大事なことは **dotfiles**というリポジトリ名で作ること。
制約ができるわけではありませんが、別の名前にするとたぶんあとで後悔します。。。

作ったdotfilesリポジトリをcloneしてきます。
homeshickコマンドを使えばすぐに移動できます。
また、homeshickは`$REPO_HOME/home`以下のファイルのシンボリックリンクを作成するため、ディレクトリを作成しておきます。

```console
$git clone https://github.com/budougumi0617/dotfiles.git ~/.homesick/repos/dotfiles
$homechick cd dotfiles
$mkdir home
```

### dotfilesリポジトリ内にドットファイルを入れる
今まで設定した環境設定ファイルを`$REPO_HOME/home`に移動しておきます。

```console
$cp ~/.vimrc ~/.homesick/repos/dotfiles/home/
$cp ~/.zshrc ~/.homesick/repos/dotfiles/home/
```


### dotfilesリポジトリ内にプラグインのリポジトリを登録する
`git submodule`コマンドで自分のリポジトリから他のリポジトリに存在するプラグインに対してリンクを貼っていきます。

```console
$git submodule add https://github.com/Shougo/unite.vim.git ~/.homesick/repos/dotfiles/home/.vim/bundle/unite.vim
$git submodule add https://github.com/Shougo/neobundle.vim ~/.homesick/repos/dotfiles/home/.vim/bundle/neobundle.vim
git submodule add https://github.com/robbyrussell/oh-my-zsh.git ~/.homesick/repos/dotfiles/home/.oh-my-zh
```
### dotfilesリポジトリ内にプラグインのリポジトリを取り込む
上記だけだと実体が無いので、以下のようにして外部リポジトリからファイルを取得します。

```console
$homeshick cd dotfiles
$git submodule init
$git submodule update
```

### homeshickでシンボリックリンクを貼る！

これで準備が出来ました。`homecshick symlink dotfiles`コマンドでシンボリックリンクが`$HOME`以下に作成されていきます。既に環境設定ファイルを作成していた場合は上書きで。

## 他のOS環境で作成したdotfilesリポジトリを用いる

一度作ればあとは簡単です！と言いつつけっこーコマンド多いですね。
当然、vim上で`:NeoBundleInstall`コマンドを行ったり、`zsh`などへのシェルの変換も別途行う必要があります。
しかしめんどくさいのは最初だけ！

```console
$git clone git://github.com/andsens/homeshick.git ~/.homesick/repos/
$printf '\nsource "$HOME/.homesick/repos/homeshick/homeshick.sh"' >> $HOME/.bashrc
$printf '\nsource "$HOME/.homesick/repos/homeshick/completions/homeshick-completion.bash"' >> $HOME/.bashrc
$source ~/.bashrc 
$git clone https://github.com/budougumi0617/dotfiles.git ~/.homesick/repos/
$homeshick cd dotfiles
$git submodule init
$git submodule update
$homeshick symlink dotfiles
```

## まとめ
最近は簡単に仮想環境を作れたり複数環境で作業することが多いので、「VM上でちょっと追記した`.vimrc`をメイン環境でも使いたい！」と思うときなどかなりはかどります。

- 環境設定ファイルをGithubで共有すると共有が出来て便利
- homeshickを使えば簡単にリポジトリ内の環境設定ファイルのシンボリックリンクを`$HOME`に貼れる
- `git submodule`コマンドで配布されているプラグインの管理も可能

ただしこれだけは注意してください。

- **社内プロキシ設定情報などを環境設定に書いているファイルは注意！**

とくにGitHubはファイル自体を削除してもログで確認できますので、リポジトリに歴史を変える必要ができますよ。
`.gitconfig`などが該当します。ただ以下のような抜け道もあります。

dotfilsをGitHub管理したいけど.gitconfigは社内proxy情報が…ってときは！
http://qiita.com/budougumi0617/items/bc04364464488802f54e

## 参考文献
今回は以下の内容を参考にさせていただきました！

Homeshickでdotfilesを管理することにした
http://befool.co.jp/blog/jiska/homeshick-git-dotfile-synchronizer/

dotfiles (設定ファイル)の管理に git submodule を使う
http://qiita.com/sonots/items/adae6cda0bb7a05f8905

homeshickコマンドの詳細は以下で。
https://github.com/andsens/homeshick/wiki/Commands