「Mercurial、こんなことも知らなかったの?>自分」シリーズ第4弾(つうほどのものか?)
- ナルホドー! 使って分かった Mercurial と Bitbucket の便利さ - 檜山正幸のキマイラ飼育記
- 分散バージョン管理系Mercurial こんなことも知らなかったの?>自分 - 檜山正幸のキマイラ飼育記
- Bitbucketの長時間ダウンで思ったよ、分散バージョン管理系ってほんとに素晴らしい! - 檜山正幸のキマイラ飼育記
今日の話題は、hg rename。これは、ファイルをコピーしてから削除します。ディレクトリに対して hg rename しても、ディレクトリ自体のリネームはしないで、新しいディレクトリにファイルを順次コピー&削除。古いディレクトリは残ります。
これだけ聞くと、リネームをまたいでの履歴管理をやってないみたいに思えます。実際、僕は「リネームすると追跡できないのか?」と疑問を持っていました。もちろん、Mercurialはちゃんと追跡しています。
実験してみます。以下はCygwinのbash。冗長なプロンプトは削っています。
$ cd ~/tmp$ mkdir hg-test
$ cd hg-test/
$ hg init
$
これでリポジトリは完成。
$ echo hello > hello.txt$ hg add hello.txt
$ hg commit -m 'hello created'
$ hg log
changeset: 0:c013cd2d0e3a
tag: tip
user: Masayuki HIYAMA
date: Thu Dec 17 16:15:28 2009 +0900
summary: hello created
$ hg rename hello.txt greeting.txt
$ hg commit -m 'renamed hello.txt --> greeting.txt'
$ hg log
changeset: 1:9167c2f03385
tag: tip
user: Masayuki HIYAMA
date: Thu Dec 17 16:17:23 2009 +0900
summary: renamed hello.txt --> greeting.txtchangeset: 0:c013cd2d0e3a
user: Masayuki HIYAMA
date: Thu Dec 17 16:15:28 2009 +0900
summary: hello created
$
と、これで、hello.txt が作られ、それが greeting.txt にリネームされました。
$ echo 'hello, world.' > greeting.txt$ hg commit -m 'edit the file'
$ hg log greeting.txt
changeset: 2:8a4050fda097
tag: tip
user: Masayuki HIYAMA
date: Thu Dec 17 16:20:05 2009 +0900
summary: edit the filechangeset: 1:9167c2f03385
user: Masayuki HIYAMA
date: Thu Dec 17 16:17:23 2009 +0900
summary: renamed hello.txt --> greeting.txt
$
あらら、昔の名前(あるいは旧姓)の時代の履歴は出てきませんね。--follow(短縮形は -f)ってオプションを付けるんですね。
$ hg log --follow greeting.txt
changeset: 2:8a4050fda097
tag: tip
user: Masayuki HIYAMA
date: Thu Dec 17 16:20:05 2009 +0900
summary: edit the filechangeset: 1:9167c2f03385
user: Masayuki HIYAMA
date: Thu Dec 17 16:17:23 2009 +0900
summary: renamed hello.txt --> greeting.txtchangeset: 0:c013cd2d0e3a
user: Masayuki HIYAMA
date: Thu Dec 17 16:15:28 2009 +0900
summary: hello created
$
--follow オプションは、hg annotate でも使えます。