Git のトピックブランチで開発している時に、他のブランチを同時にチェックアウトしておきたくなる事がままある。
いったんテンポラリコミットを作ったり、あるいは stash したりして作業ツリーを保存してチェックアウトしなおして用事を済ませて元に戻すとかはやるのだけれど、ちょっと面倒。3番目のケースは同時にチェックアウトしたいのでこの方法だと駄目だし、4番目のケースだとしばらくそのままにしておかないのでもっと困る。
そのような時はローカルリポジトリから別ディレクトリへ clone して、そちらをサブで使ったりするんだけれど、サブの方でちょっと修正したりした際にローカル間で push/pull とかしなければならなくてこれまた面倒。
なんかいいのないかなと思ったら Git の contrib に git-new-workdir というのがあるのを昨日知った。
git-new-workdir . ../sub あるいは git new-workdir . ../sub
で作業ツリーを新しく作れる。/tmp/git/main を /tmp/git/sub に new-workdir すると sub の方の .git の中は
drwxr-xr-x 3 naney naney 4096 1月 30 00:37 . drwxr-xr-x 3 naney naney 4096 1月 30 00:37 .. -rw-r--r-- 1 naney naney 23 1月 30 00:37 HEAD lrwxrwxrwx 1 naney naney 25 1月 30 00:37 config -> /tmp/git/main/.git/config lrwxrwxrwx 1 naney naney 24 1月 30 00:37 hooks -> /tmp/git/main/.git/hooks -rw-r--r-- 1 naney naney 104 1月 30 00:37 index lrwxrwxrwx 1 naney naney 23 1月 30 00:37 info -> /tmp/git/main/.git/info drwxr-xr-x 2 naney naney 4096 1月 30 00:37 logs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 objects -> /tmp/git/main/.git/objects lrwxrwxrwx 1 naney naney 30 1月 30 00:37 packed-refs -> /tmp/git/main/.git/packed-refs lrwxrwxrwx 1 naney naney 23 1月 30 00:37 refs -> /tmp/git/main/.git/refs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 remotes -> /tmp/git/main/.git/remotes lrwxrwxrwx 1 naney naney 27 1月 30 00:37 rr-cache -> /tmp/git/main/.git/rr-cache lrwxrwxrwx 1 naney naney 22 1月 30 00:37 svn -> /tmp/git/main/.git/svn
のような感じで HEAD と index と logs/HEAD 以外はもとのローカルリポジトリへのシンボリックになっている。なので sub での checkout や index の Git 操作など以外は main の方へ反映されるようになっている。わざわざ push/pull しなくて良いのでこれは楽ちん。もちろん作業ツリーはそれぞれ独立しているので、例えばサブの方で Web サーバを起動しておいたり時間のかかるフルテストを走らせておくとかもできる。
ただ複数チェックアウトして作業していると、気がつくと Emacs で違うほうの作業ツリーのファイルを開いて編集していたりして「あれ? 変更したけれどなぜか反映されない……」とかやっちゃうので(実際やった)ちょっと注意が必要ではある。
git-new-workdir は contrib の中(Debian GNU/Linux sid だと /usr/share/doc/git/contrib/workdir/git-new-workdir)にあるみじかいシェルスクリプトなので適当に PATH の通ったところにコピーして実行権限を設定しておけば OK。
Git はこういうところがカワイイよね。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。