work tree の外から git pull する

バッチスクリプトなどで work tree の外から git pull を行いたい、ということはままあるシチュエーションであると思います。

git コマンドは --git-dir オプションでコマンドで操作する .git ディレクトリを指定できるので、これを指定すれば済むと思うかもしれませんが、これではうまくいきません:

cd $HOME
git --git-dir=$HOME/repos/@aereal/dotfiles/.git pull
# Cannot pull with rebase: You have unstaged changes.
# Please commit or stash them.

work tree も指定する必要があります:

git --git-dir=$HOME/repos/@aereal/dotfiles/.git --work-tree=$HOME/repos/@aereal/dotfiles pull

あるいは Git 1.8.5 以降であれば -C オプションが使えます:

git -C $HOME/repos/@aereal/dotfiles pull

git-sh-setup.shrequire_clean_work_tree() 関数が git diff-files --quiet --ignore-submodules を実行して終了ステータスが非ゼロだと上記のようなエラーメッセージを出力して終了するようです。