mercurialでgit new-workdir

ローカルのリポジトリをコピーするための専用のコマンドはmercurialには無い。*1 単にcloneすればよい。

hg clone <repository> <new_workdir_path>

追記: git new-workdirは.git以下のファイル郡をsymlinkで共有しているので、元のリポジトリのコミットがnew_workdirでも参照できるが、hg cloneの場合は完全に別リポジトリということに注意。

速度

git new-workdirはsymlinkを使うことによってcpより早いよ、という話。 mercurialの場合、ローカルリポジトリのクローン時には(unix系OSでもwindowsでも)hard linkが利用されるため、cpより早い。

% hg version | head -n1
Mercurial Distributed SCM (version 2.7)

% time (hg clone rhodecode-enterprise rhodecode-enterprise-clone)
updating to branch default
1852 files updated, 0 files merged, 0 files removed, 0 files unresolved
( hg clone rhodecode-enterprise rhodecode-enterprise-clone; )  1.53s user 1.15s system 42% cpu 6.394 total
% time (cp -R rhodecode-enterprise rhodecode-enterprise-cp)
( cp -i -R rhodecode-enterprise rhodecode-enterprise-cp; )  0.13s user 2.46s system 16% cpu 15.331 total

この例では2.5倍くらいcloneの方が早い

ちなみに

hg clone だと作業領域が作られる(ファイルが展開される)ので、作りたくない場合は次のコマンドを利用しよう

% hg clone -U <src> <dest> # クローン時に作業領域を作らない
% hg update null # リポジトリの作業領域を消す

参考

*1:mercurialにbareリポジトリという概念無いので。