3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

git-new-workdir + rsync でワーキングディレクトリの Git 管理外のファイルも複製する

Last updated at Posted at 2015-11-07

割りと有名だが 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 特有の「スラッシュ忘れて死亡」よりは手軽に安全 )

cp-workdir
# !/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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?