Mercurial: "Mercurial in daily use" を読む
Tagged:  •    •  

今回は "5. Mercurial in daily use" を読みます。

ここまでの各章では、 Mercurial のコマンド・コンセプトに関する詳細の説明でしたが、 この章では日々の利用における概観の説明に主眼を置きつつ、 これまでの説明で漏れていた話題について触れています。

5.1 Telling Mercurial which files to track

構成管理下に無いファイルに対しては hg status が '?' を表示するので、 hg addhg commit で構成管理対象への追加を行いましょう、 という話。

5.1.1 Explicit versus implicit file naming

ディレクトリの指定などによる「暗黙の」ファイル名指定の場合には Mercurial は処理対象ファイル名を一覧表示します。

5.1.2 Aside: Mercurial tracks files, not directories

Mercurial が空のディレクトリを取り扱えない (パッチが空のファイルを扱えないのと似ていますね) ことを補う方法として:

  • "." で始まる隠しファイルを使う
  • スクリプトで都度生成する

とありますが、 実際空ディレクトリの必要性は、 世間的にはどの程度なんでしょうね?

5.2 How to stop tracking a file

構成管理対象からの除外は hg remove で行う、という話。

5.2.1 Removing a file does not affect its history

変更履歴は hg remove によっても削除されませんから、 ある意味「安心して削除」することができます。

5.2.2 Missing files

手動でファイルを削除してしまった場合:

構成管理対象から除外したい:
hg remove --after により Mercurial に事後通知
ファイルを元に戻したい:
hg revert で復旧

という対処が可能です。

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

構成管理対象からの除外が自動化されると、 うっかりミスが増えるからよくないよね、 という話。

5.2.4 Useful shorthand―adding and removing files in one step

新規ファイルの自動登録と不在ファイルの自動削除を行う hg addremove コマンドと、 コミットでまとめてそれを行う hg commit -A が提供されています。

5.3 Copying files

Mercurial はファイルの複製も適切に扱えます。

5.3.1 The results of copying during a merge

あるファイルに変更を行ったチェンジセットと、 そのファイルからの複製を行うチェンジセットをマージすると、 元ファイルの変更は複製先に伝播します。

5.3.2 Why should changes follow copies?

複製先に変更が伝播しないと、 折角の変更が行き場を失って意味がなくなるよね、 という話。

5.3.3 How to make changes not follow a copy

伝播が不要なら、 普通のコマンドで複製して hg add してね、 という話。

5.3.4 Behaviour of the “hg copy” command

Mercurial は 「ディレクトリの再帰的な複製」も、 「hg copy --after による事後通知」も可能です。

5.4 Renaming files

改名は「複製+元ファイルの削除」 として実装されているので、 実は複製の説明は改名の説明のための伏線でした、 という話。

5.4.1 Renaming files and merging changes

改名でも元ファイルへの変更が伝播する、という話。

5.4.2 Divergent renames and merging

複数の開発者が同じファイルを別な名前に改名した場合、 Mercurial は両方の改名先ファイルを存続させます。

少し前の版の BOS Book では O'Sullivan 氏はこの挙動に対する不満を明記していましたが、 「警告は表示するが、最終的にそれをどう収束させるかは利用者次第」 という挙動になったことで、 最新版ではその部分がバッサリ削除されています。

5.4.3 Convergent renames and merging

別なファイルを同じ名前に改名した場合はファイル内容の衝突の解決が必要、 という話。

5.4.4 Other name-related corner cases

同じ名前がファイルとディレクトリで衝突した場合は、 最新の Mercurial でも上手く取り扱えないようです。 他の構成管理システムでも(多分)扱えないでしょうから、 特別問題にはならないでしょうけどね。

5.5 Recovering from mistakes

やり直し・取り消しに関する詳細は、 "9. Finding and fixing your mistakes" で説明されています。


Mercurial の使い方についてはそこそこ知っているつもりでいましたが、 いやぁ、日々是勉強な感じです。

こまかいオプションに関しては、 逆に日常的に使用するコマンドの方が、 一旦使用パターンが確定すると仔細に検証することが無くなるのかもしれません (Emacs 経由だと使えない、というのもあるかもしれませんが)。


"Distributed revision control with Mercurial" 関連エントリの一覧は、BOSBook(Bryan O’Sullivan Book)タグで参照できます。