彷徨えるフジワラ

年がら年中さまよってます

並行した複数ファイルへの改名(divergent rename)

本エントリも、備忘録代わりに「お気に入り」に入れてあるツィートの棚卸しシリーズの一部です(笑)

昨年、以下のようなツィートを見かけました。

もしかしたら、「改名の履歴を辿りきれない」ケースかも?ということで、色々確認したところ:

とのことでした。

あるリビジョン A において追加されたファイル A を:

  • A の子孫 D1 で、ファイル A を X に改名
  • D1 とは別の子孫 D2 で、ファイル A を Y に改名

といった感じで改名したリビジョン D1 および D2 (またはその子孫)をマージした場合、上記のような「ファイル A からの改名」は "divergent rename" (直訳するなら「枝分かれした改名」)として認識されます。
hg merge の実行中に FILENAME に関する divergent rename が検出された場合、以下のような警告メッセージが出力されます。

※ 英語版:
note: possible conflict - FILENAME was renamed multiple times to:

※ 日本語版:
備考: 衝突の可能性 - FILENAME が複数のファイルに改名されました:

この場合の意図は、「2つ(あるいはそれ以上)に別れた改名先を、このまま残して大丈夫?」というものです(改めて見ると、処理上は「警告」表示なのに、メッセージ的には「備考」扱いというのも変ですね)。

先述したように、この状況が「意図的に行った結果」なのか、「手違いによる予期せぬ結果」なのかは、自動的に判定しようがありません。そのため、この先の対処の有無に関しては、利用者にゆだねられています。

但し、TortoiseHg 等のフロントエンドを使用している場合は:

といったように、警告の存在が視覚的に認識しやすとは言えない状況にあるかもしれません。

そこで、divergent rename が検出された場合に、マージを継続するか中断するかを選択可能にする修正を提案してみたのですが:

残念ながら、上記のような結果となりました。

以上の事から:

マージ結果をコミットする前には、"possible conflict"(「衝突の可能性」)といった警告表示の有無を十分確認するようにしてください。

なお、TortoiseHg のマージダイアログに関しては:

とのことです。

※ 2014-01-28 追記: 対応修正が入りましたので、2.11 以降では安心して作業ができますね。

ちなみに、"possible conflict" な警告は、以下のようなケースでも表示されます。

  • A の子孫 D1 で、ファイル A を登録除外(remove or forget)
  • D1 とは別の子孫 D2 で、ファイル A を X に改名

この場合の意図は、「改名先の X を、このまま残して大丈夫?」というものです。