Gitを使ってドットファイルをバージョン管理する方法

仕込み編

$ cd $HOME
$ mkdir .dotfiles
$ cd .dotfiles        (2010/01/04追記;忘れてました)
$ git init
$ git remote add origin <YOUR_GIT_REPOSITORY>
$ cat > import_dotfiles.rb 
#!/usr/bin/ruby

require "fileutils"

DEST_DIR = File.expand_path("~/.dotfiles")
TARGETS = <<EOS
  ~/.bash_profile
  ~/.bashrc
  ~/.hgrc
  ~/.gitconfig
  ~/.gitignore
  ~/.git-completion.bash.ps1only
  ~/.gvimrc
  ~/.inputrc
  ~/.screenrc
  ~/.vim
  ~/.vimrc
  ~/.zshrc
  ~/.MacOSX
EOS

TARGETS.each { |target|
  from = File.expand_path(target.strip)
  if FileTest.exists?(from)
    puts "#{from} --> #{DEST_DIR}"
    FileUtils.cp_r(from, DEST_DIR)
  end
}

$ chmod +x import_dotfiles.rb
$ ./import_dotfiles.rb
$ git add .
$ git commit -m "initial import"

(↓2010/01/04修正;別マシンでcloneすることを考えるとmasterは合った方がいい)
$ git push origin master
$ git checkout -b <YOUR_HOST_NAME>
YOUR_GIT_REPOSITORY: gitリポジトリ

自分はDropboxのディレクトリを$HOME/Dropboxにしていて、この上に自分用のprivateリポジトリを作っています。
もし、同じようにやるなら、上記のgit remote addの前に下の作業をしておけばOk.

$ cd $HOME/Dropbox/gitrepos
$ mkdir dotfiles.git
$ cd dotfiles.git
$ git init --shared --bare
YOUR_HOST_NAME: gitのブランチ名

複数マシン上のドットファイルを管理したいので、各マシン上のメインブランチをそのマシンのホスト名にしておいて、共有リポジトリにそれぞれ別のブランチとなるようにpushする方式をとります。

日常編

ドットファイルを編集した後は、以下の作業を行います。

$ cd $HOME/.dotfiles
$ ./import_dotfiles.rb
$ git commit -a -m <COMMIT_MESSAGE>
$ git push

ブランチ名をマシンごとに変えているので、1つの共有リポジトリに複数のマシンのドットファイルを管理できます。

とりあえず、これでしばらく運用してみます。

別マシンでドットファイル管理をはじめる場合

一度以下を実行した後は、最初のマシンの日常編と同じです。

another$ cd $HOME
another$ git clone <YOUR_GIT_REPOSITORY>/dotfiles.git .dotfiles
another$ cd .dotfiles
another$ git checkout -b <ANOTHER_HOST_NAME>
another$ ./import_dotfiles.rb
another$ git add .
another$ git commit -m <COMMIT_MESSAGE>
another$ git push origin <ANOTHER_HOST_NAME>

別マシン上のファイル内容との比較など

YOUR_HOST_NAMEが今のマシン、ANOTHER_HOST_NAMEが比較対象マシンだとします。

まずは、リモートブランチから、比較対象マシンのローカルブランチを作ります。

$ git checkout -t origin/<ANOTHER_HOST_NAME>

一度ブランチ作っておけば、後はpullで更新するだけでずっと使えます。


ファイル内容比較は、今のマシン用のブランチ上で以下を実行します。

$ git diff <ANOTHER_HOST_NAME> -- <FILE_PATH>
()
$ git diff <ANOTHER_HOST_NAME> -- .vimrc

ファイル内容の取得は、今のマシン用のブランチ上で以下を実行します。

$ git show <ANOTHER_HOST_NAME>:<FILE_PATH>
()
$ git show <ANOTHER_HOST_NAME>:.vimrc  > .vimrc-another

2010/01/04追記

別マシンでドットファイル管理をはじめようとして、問題・記述不足が分かったので追記しました。
ポイントは、↓です。

  • ダミーで良いのでmasterブランチは合った方が良い
  • 別マシンでドットファイル管理をはじめるときは、既存リポジトリをcloneする(あたりまえですけど)