現在の git レポジトリから新しい作業ディレクトリを作る dit-dup 作った

git new-workdir

git のレポジトリで作業しててふと他のことがしたくなった場合、 stash とかを使ったりするけど、先日 git-new-workdir を知った(参考:git-new-workdir が便利 - #生存戦略 、それは - subtech)。

簡単にいえば、あるレポジトリについて .git/ 以下のほとんどを symlink で共有した新しい作業ディレクトリを作ってくれる。 そのため、片方の作業ディレクトリで commit したりすると他の方でもその commit が見える。 その上 HEAD は共有されないため、例えば一つのレポジトリについてそれぞれの作業ディレクトリで別の branch を checkout して commit するみたいなことができる。

で、 git-new-workdir はこんなふうに使うのだけど、

git-new-workdir <repository> <new_workdir> [<branch>]

これがわりとめんどくさいと思った。

  • 複製元は今いるレポジトリでいい
  • 新しいディレクトリも今いるところに良い感じにつくればいい
  • ついでにブランチが無ければ新しく作って欲しい

そこで、これの上にかぶせる git-dup.sh を作った。

Install

git-dup.shgit-dup として PATH の通ったところに保存する。 git-new-workdir/usr/local/share/git-core/contrib/workdir/git-new-workdir みたいなところから探してきて PATH の通ったところに simlink 貼るなりする。

Usage

$ git dup [<branch>]

How It Works

  • 指定されたブランチが無ければ作成する
  • ブランチ名を省略した場合、現在いるブランチを使う
  • 今いるのが detached-HEAD だった場合、 master ブランチを使おうとする
  • そのとき master ブランチがなかったらエラーで死ぬ
  • 新しいディレクトリを _<repname>_<branch> として作成する。 repname は今いるディレクトリの名前が使われる。 既にあったら死ぬ
  • git new-workdir を使って現在のレポジトリの作業ディレクトリをそのディレクトリ内に作成しブランチを checkout する