割りと有名だが git-new-workdir というコマンドで、ワーキングディレクトリを複製できる。
簡単に仕組みを説明すると、複製先には .git
内のファイルがシンボリックリンクで参照されるという、とてもわかり易い単純な原理になっている。この性質のため、リモートブランチを個別に更新する必要はなく、 stash の内容はコピー先とコピー元で共有される。
しかし、 git-new-workdir
では Git で管理していないファイル (.gitignore
で無視しているファイル) や、
まだコミットしていないファイルまでは複製されない。
単にコミットしていないだけならば、 git stash
した後に、両方のディレクトリで git stash apply
すれば共有できるのだが、 .gitignore
で無視しているファイルをコピーしたいケースもよくあると思う。(例えば Node のプロジェクトで node_modules
を無視してる時とか)
そういう時は、 git-new-workdir
した後に rsync
で他のファイルもコピーすればいい。
ただし .git
ディレクトリは git-new-workdir
で複製した方を使ったほうが楽なので、これは rsync の複製からは除外する。
※
シェルスクリプト化したもの
けっこうこれを何度もやっているので、シェルスクリプト化することにした。
rsync
の引数の srcdir
には末尾に /
を常に加えている。
( 冗長だが rsync
特有の「スラッシュ忘れて死亡」よりは手軽に安全 )
#!/usr/bin/env bash
set -eu
if [ "$#" -ne 2 ]; then
echo "Usage: $0 source_dir target_dir" >&2
exit 1
fi
srcdir="$1"
dstdir="$2"
git-new-workdir "$srcdir" "$dstdir"
rsync -Hax --exclude .git "$srcdir/" "$dstdir"
これを適当なディレクトリに配置して PATH を通しておけば良い。
もちろん、元の git-new-workdir
にも PATH を通しておく必要がある。
使い方
$ cp-workdir コピー元ディレクトリ コピー先ディレクトリ
参考
http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068
http://qiita.com/snaka/items/2a19f5dca568329f8f8e
http://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542
http://qiita.com/nagais/items/7403411b4aa193d0fa0d