Chapter 5
Mercurial in daily use

5.1 Telling Mercurial which files to track

ファイル指示しないリポジトリファイルして Mercurial いませんhg statusコマンド Mercurial ファイル?することでらせてくれます

Mercurial による指示するにはhg addコマンド使しますファイル指示したファイルhg statusによる?から Aへとします

1  $ hg init add-example
2  $ cd add-example
3  $ echo a > a
4  $ hg status
5  ? a
6  $ hg add a
7  $ hg status
8  A a
9  $ hg commit -m ’Added one file’
10  $ hg status

hg commitしたコミットしたファイルhg statusによりされることはありませんこれはファイル したりMercurial らかのしたファイル についてするのがhg statusだからですファイルからリポジトリがあるされてはいてもされていない ファイルするようにそのようなファイルることもできますしいとうことは

ファイルしたとしてもそのファイルして Mercurial はすぐにはいませんそのわりコミットファイルスナップショットします Mercurial はそれからするまでコミットにはファイルします

5.1.1 Explicit versus implicit file naming

Mercurial 有用いとしてMercurial コマンドディレクトリしたそのディレクトリての ファイル1 する実施されたものとみなします

1  $ mkdir b
2  $ echo b > b/b
3  $ echo c > b/c
4  $ mkdir b/d
5  $ echo d > b/d/d
6  $ hg add b
7  adding b/b
8  adding b/c
9  adding b/d/d
10  $ hg commit -m ’Added all files in subdirectory’

aファイルしたにはMercurial されたファイルファイルしていませんがこのではされたファイルしているしてください

ではするファイルコマンドラインしましたのでそのような利用者自いを しているものとみなしMercurial しません

しかしディレクトリすることでファイルした Mercurial となったファイルしますこうすることで実施されたのかがになるためひっそりとやっかいなするしますこの いはどの Mercurial コマンドしています

5.1.2 Aside: Mercurial tracks files, not directories

ディレクトリMercurial によるにはなりませんそのわりMercurial ファイルパスしますファ イル生成にはそれにってパスまれるしないディレクトリしますファイルには されたファイルへのパスまれるディレクトリしますたわいもいことにこえるかもしれません Mercurial っぽのディレクトリえないというさいながらもしていま

ディレクトリ有用なことはいですしるためのえめな避方法がありますEmpty directories are rarely useful, and there are unintrusive workarounds that you can use to achieve an appropriate effect. それディレ クトリうことによる定的それにとされるさにうものではないMercurial しまし

ディレクトリリポジトリしたい方法がありますつはディレクトリファイル hg addすることですUNIX ライクシステムではピリオド.まるファイルどのコマンドGUI からファイルとしてわれますこの 5.1します


1  $ hg init hidden-example
2  $ cd hidden-example
3  $ mkdir empty
4  $ touch empty/.hidden
5  $ hg add empty/.hidden
6  $ hg commit -m ’Manage an empty-looking directory’
7  $ ls empty
8  $ cd ..
9  $ hg clone hidden-example tmp
10  updating working directory
11  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12  $ ls tmp
13  empty
14  $ ls tmp/empty

Figure 5.1: Simulating an empty directory using a hidden file

ディレクトリとするのもうつの方法されたビルドスクリプトになる都度するというものです

5.2 How to stop tracking a file

リポジトリにとってになった2 ファ イルがあるhg removeコマンド使ますこのコマンドファイルしつつMercurial からファイルする通知しますされたファイルhg statusでは Rきでされま

1  $ hg init remove-example
2  $ cd remove-example
3  $ echo a > a
4  $ mkdir b
5  $ echo b > b/b
6  $ hg add a b
7  adding b/b
8  $ hg commit -m ’Small example for file removal’
9  $ hg remove a
10  $ hg status
11  R a
12  $ hg remove b
13  removing b/b

hg removeによるファイルうとディレクトリファイルしたとしてもMercurial はそ ファイルからしますファイル生成Mercurial によるにはにそのファイル hg addしてくださいMercurial えられたファイルしていたファイルとはであ るとみなします

5.2.1 Removing a file does not affect its history

ですのでhg removeコマンドによるつだけであるしてください

hg removeコマンドによるファイルにはえません

ディレクトリhg removeしたファイルがまだされていたチェンジセットしたその チェンジセットコミットされたディレクトリファイル生成されますそのファイル hg removeされたチェンジセットするとMercurial ファイルからしま

5.2.2 Missing files

hg removeコマンド使せずにディレクトリからしたファイルMercurial 方不とみなします方不 ファイルhg statusでは !きでされますMercurial コマンド方不ファイルしては いません

1  $ hg init missing-example
2  $ cd missing-example
3  $ echo a > a
4  $ hg add a
5  $ hg commit -m ’File about to be missing’
6  $ rm a
7  $ hg status
8  ! a

hg status方不としてするファイルリポジトリにある 3 ファ イルhg remove --afterすることでファイルからするがあることを Mercurial 通知することができます

1  $ hg remove --after a
2  $ hg status
3  R a

その方不とされているファイルせずにしてしまったものならhg revertファイルする ことでされていないファイルすることができます

1  $ hg revert a
2  $ cat a
3  a
4  $ hg status

5.2.3 Aside: why tell Mercurial explicitly to remove a file?

ファイルMercurial についてわれるかもしれませんMercurial における 方法そのようににとってはましいものかもしれませんMercurial hg commitコマンドファイル ファイルからしていたのですこの方法では通知ファ イルされるこります

5.2.4 Useful shorthand—adding and removing files in one step

Mercurial へのファイルわせコマンドであるhg addremoveしていま

1  $ hg init addremove-example
2  $ cd addremove-example
3  $ echo a > a
4  $ echo b > b
5  $ hg addremove
6  adding a
7  adding b

hg commitコマンドコミット実施hg addremoveへの-A オプション しています

1  $ echo c > c
2  $ hg commit -A -m ’Commit with addremove’
3  adding c

5.3 Copying files

Mercurial ファイルhg copyコマンドしていますこのコマンドファイルしたMercurial はそ ファイルファイルであることをしますチェンジセットにはMercurial はこのファイル いします

5.3.1 The results of copying during a merge

ファイルにはファイルまで してきますこのことがするた めにしましょうこれまでのつだけファイルリポジトリしま

1  $ hg init my-copy
2  $ cd my-copy
3  $ echo line > file
4  $ hg add file
5  $ hg commit -m ’Added a file’

うためにはしてがありますのでリポジトリしましょう

1   $ cd ..
2  $ hg clone my-copy your-copy
3  updating working directory
4  1 files updated, 0 files merged, 0 files removed, 0 files unresolved

リポジトリhg copyコマンドしたファイルします

1  $ cd my-copy
2  $ hg copy file new-file

hg statusコマンドではされたファイルされたファイルじようにえま

1  $ hg status
2  A new-file

しかし-C オプションきでhg statusすることでされますこのたにされたファイル であることをします

1  $ hg status -C
2  A new-file
3    file
4  $ hg commit -m ’Copied file’

したリポジトリして更作いますになったファイルしてします

1  $ cd ../your-copy
2  $ echo ’new contents’ >> file
3  $ hg commit -m ’Changed file’

このリポジトリではfile されましたリポジトリからhg pullしてつの head するMercurial file してだけったそのである new-file にまでさせま

1  $ hg pull ../my-copy
2  pulling from ../my-copy
3  searching for changes
4  adding changesets
5  adding manifests
6  adding file changes
7  added 1 changesets with 1 changes to 1 files (+1 heads)
8  (run ’hg heads’ to see heads, ’hg merge’ to merge)
9  $ hg merge
10  merging file and new-file to new-file
11  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
12  (branch merge, don’t forget to commit)
13  $ cat new-file
14  line
15  new contents

5.3.2 Why should changes follow copies?

ファイルしてるされるえるかもしれませんがくのましいいとなりま

まずはこのだけにわれるということにしてくださいファイルhg copyそれに ファイルするというにおいてはなことはわれません

もうんだリポジトリファイルしたことをらなかったファイル するということにもしてください

Mercurial がこのようにうのは以下のようなのためですえばスファイルして バグコミットしたとしますその更作われているバグ顕在やその ファイルhg copyそのファイルめてしまうかもしれませ

んでしたMercurial へのわないファイルバグ んでいるためバグさせるさないバグファイルけるでしょ

バグするからへの動反によりMercurial はこのしてい ますMercurial ファイルするこのようなシステム

ファイルとそれに実施されたならファイルからファイルへのそれ なのでMercurial まではさせますがそれいませ

5.3.3 How to make changes not follow a copy

らかのによりファイルへのないとしたならシステム方法Unix システムならcpファイルhg addによりファイルしてく ださいですがその5.3.2してMercurial によるしてくださ

5.3.4 Behaviour of the “hg copy” command

hg copyコマンド使したMercurial ディレクトリファイルしますそのため ファイルえたそのチェンジセットとしてコミットすることなくhg copyったファイルはそ までのんでいることになりますこのいについてここでべたのはするようにじられたから です)。

hg copyUnix cp コマンドいますhg cpというみであればこちらも使できます)。 それするしますファイルしないパスした Mercurial したたなファイル生成します

1  $ mkdir k
2  $ hg copy a k
3  $ ls k
4  a

ディレクトリMercurial ファイルディレクトリします

1  $ mkdir d
2  $ hg copy a b d
3  $ ls d
4  a  b

ディレクトリディレクトリしつつされます

1  $ hg copy c e
2  copying c/a/c to e/a/c

ディレクトリ4 ディレクトリディレクトリ再構されます

1  $ hg copy c d
2  copying c/a/c to d/c/a/c

ファイルしたファイルであることを Mercurial 通知するにはhg remove --after きでhg copyコマンド使します

1  $ cp a z
2  $ hg copy --after a z

5.4 Renaming files

ファイルするよりもむしろとされるのではないでしょうかファイルよりもhg copyコマンド したのはMercurial には同等っているためですそのためファイルにおける Mercurial ることでファイルされるいをることができます

hg renameコマンド使したMercurial ファイルそのファイル それらをからします

1   $ hg rename a b

hg statusコマンドからたにされたファイルされファイルされていること れます

1  $ hg status
2  A b
3  R a

hg copy-C オプションきでhg statusコマンドすることでされたファ イルにはされてしまったファイルファイルMercurial にみなされていることがわかりま

1  $ hg status -C
2  A b
3    a
4  R a

hg removeおよびhg copy--after オプションすることでしたMercurial にその することができますそれどのhg renameコマンドびにオプションhg copyコマン じです

5.4.1 Renaming files and merging changes

Mercurial としてされているためでのをしたには されます

あるファイルがそのファイルファイルしたがおいのすると ったファイルへのファイルへとしますこのいは するであろうのもので すがてのシステムがこのようにうわけではありません)。

する利用にとっておそらく有用われるですからファイルにおいても であろうことはらかといえるでしょうファイルによってってしまうこと でしょう

5.4.2 Divergent renames and merging

がりdiverging namesがとあるファイル これを foo びます リポジトリうことで します

1   $ hg clone orig anne
2  updating working directory
3  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4  $ hg clone orig bob
5  updating working directory
6  1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Anne ファイルbar します

1  $ cd anne
2  $ hg mv foo bar
3  $ hg ci -m ’Rename foo to bar’

そのBob ファイルquux します

1  $ cd ../bob
2  $ hg mv foo quux
3  $ hg ci -m ’Rename foo to quux’

ファイル命名するなるしたわけですからはこのえるのがいといま

このはどのようにうべきだといますかによるかれがじるチェンジセットMerging ファイルします

1  # See http://www.selenic.com/mercurial/bts/issue455
2  $ cd ../orig
3  $ hg pull -u ../anne
4  pulling from ../anne
5  searching for changes
6  adding changesets
7  adding manifests
8  adding file changes
9  added 1 changesets with 1 changes to 1 files
10  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
11  $ hg pull ../bob
12  pulling from ../bob
13  searching for changes
14  adding changesets
15  adding manifests
16  adding file changes
17  added 1 changesets with 1 changes to 1 files (+1 heads)
18  (run ’hg heads’ to see heads, ’hg merge’ to merge)
19  $ hg merge
20  warning: detected divergent renames of foo to:
21   bar
22   quux
23  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
24  (branch merge, don’t forget to commit)
25  $ ls
26  bar  quux

にとってこのいはでありそれがここでこのいをしているでもありますMercurial bar すかquux すかあるいはすかという選択によるうことをしていたので

にはファイルったファイル使したビルドファイルえば makefileわれ るであろうことをしますそのためAnne ファイルファイルビルド実施されるよう Makefile したBob っていますからにはディレク トリなるファイルコピAnne Bob Makefile へのしている

利用もこのいにじているようですMercurial バグ 455 してくださ

5.4.3 Convergent renames and merging

なるファイルファイルとしたによるしますこのMercurial 使へのしてきます

5.4.4 Other name-related corner cases

Mercurial ファイル使したディレクトリ使したするバグっています このMercurial バグ 29 があります

1  $ hg init issue29
2  $ cd issue29
3  $ echo a > a
4  $ hg ci -Ama
5  adding a
6  $ echo b > b
7  $ hg ci -Amb
8  adding b
9  $ hg up 0
10  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
11  $ mkdir b
12  $ echo b > b/b
13  $ hg ci -Amc
14  adding b/b
15  created new head
16  $ hg merge
17  abort: Is a directory: /tmp/issue29rmVkvG/issue29/b

5.5 Recovering from mistakes

つかのありがちないからするためにMercurial 有用コマンドつかしています

hg revertコマンドディレクトリするしますえばうっかりファイルhg addしてし まったしてしまったファイルしてhg revertすることでファイルにはえる Mercurial によるからすることができますファイルへのったすのにもhg revert利用できま

hg revertコマンドコミットしてであるということはえておきましょうコミッしたいであることにいたでも選択られてはいますがすることはできま

hg revertコマンドするコミットみのするしては9  してくださ