Re: [mercurial-ja:1904] [beyondcompare4] [TortoiseHG]マージが正常に行われない

27 views
Skip to first unread message
Message has been deleted
Message has been deleted

Katsunori FUJIWARA

unread,
Aug 1, 2019, 7:56:03 AM8/1/19
to mercurial-ja
藤原です。

BeyondCompare の機能一覧を見る限りでは、ファイル内容の意味を解釈
した上でのいわゆる semantic merge ではなく、Mercurial 組み込みの
マージツールや WinMerge と同様の文字列ベースでのマージのように見
受けられます。

https://www.scootersoftware.com/features.php?zz=features_list

ざっと見た限りで怪しそうなのは、 以下の差分に関して無視す
る "Ignore unimportant differences" なる機能とか、
"Ignore replaced text and renamed identifiers" なる機能あたりでしょ
うか。

- Comments
- Whitespace
- Delimited strings
- Regular expressions
- Character case
- Page headers
- Columns
- Line terminator style
- Manually ignore selection

ファイル内容の判定は、拡張子や冒頭行の "#!" 記述、言語固有キーワー
ド等を用いた簡易判定なのだと思いますから、対象言語判定の誤認によっ
て、本来は重要な差分が無視可能扱いになってしまっている可能性はあ
ります。


なお、外部マージツールを使用する場合、デフォルトで premerge が有効
(= 内部マージツールでマージ成功なら外部マージツール起動は省略) に
なっていますが、そちらの環境での BeyondCompare4 の設定&発生して
いる問題は以下のいずれになるでしょうか?

a. premerge = true のままなので、内部マージツールでの衝突検出時のみ
BeyondCompare4 を適用

a-1: BeyondCompare4 が衝突箇所に対する処理結果が想定外の内容
a-2: BeyondCompare4 が衝突箇所「以外」に対する処理結果が想定外の内容

b. premerge = false に設定することで、マージでは常に
BeyondCompare4 を適用

b-1: 衝突発生時に BeyondCompare4 のマージ結果が想定外の内容
b-2: 衝突「非」発生時に BeyondCompare4 のマージ結果が想定外の内容

相談内容での言及的には b-2 のケースではないかと推測しているのです
が、この認識で合ってますか?


安全性を考慮しつつ、BeyondCompare4 の適用結果を評価するのであれば、
外部マージツールとして、以下のような処理を行うスクリプト/バッチ
ファイルを使用するという手も (BeyondCopmare4 に関してはあまり厳密
に確認せずに書いてますので、仕様上実現できないかもしれませんが……)

1. Mercurial 組み込みのマージツールでマージ

マージ結果は一時ファイル (A) に書き出す。
衝突の有無 (= 終了コード) も記憶しておく。

以前実装した以下のエクステンションを使うことで、外部のマージ
ツールとして使用できる筈 (最新版の Mercurial で稼働可能かは
未確認ですが……)

https://bitbucket.org/foozy/hgext-simplemerge/src/default/

2. BeyondCompare4 で「非」対話的にマージ ("/automerge" + "/force" ?)

マージ結果は一時ファイル (B) に書き出す。
衝突の有無 (= 終了コード) も記憶しておく。

3. マージ方法で衝突検出結果が異なる場合はエラー終了 (= 衝突未解消扱い)

4. いずれのマージでも衝突が確認された場合は、BeyondCompare4 で
対話的にマージ

念の為一時ファイル (A) も別途表示した方が良い?

マージが完了したら、スクリプトは終了。

5. いずれのマージでも衝突が検出されなかった場合は、一時ファイル (A)/(B) を比較

5-1. 不一致ならエラー終了 (= 衝突未解消扱い)
5-2. 一致なら本来の結果書き出し先にマージ結果をコピーして終了


ちなみに、 BeyondComapre の特徴として、フォルダ同士の比較を行う際
に、最終更新日やファイルサイズ等の一部の情報の一致をもって「変更
なし」とみなす "Flexible comparison criteria" なるものが挙げられ
ていました (おそらく実行速度重視なケース向けでしょう)。

デフォルトでこれらが有効化されているかは未確認ですが、extdiff エ
クステンションとの併用で複数ファイルの差分出力 (= フォルダ間比較)
をした場合、これらが有効だと差分の見逃しが発生する可能性はありそ
うですね。

2019年8月1日(木) 10:19 ohira <shin....@gmail.com>:
>
> いつもお世話になっております。
> おおひらです。
>
> マージツールとしてbeyondcompare4を指定した場合 mercurial本体でマージすれば問題がない部分で問題が発生し
> マージされるべき変更内容が一部消えてしまうことがわかりました。
>
> 回避策としては、beyondcompare4 でのマージをやめて
> keep-merge3でwinmerge を使うことです。
>
>
> マージ時に修正されるファイルや数英箇所が多いため全ての修正が正しくマージされたかを
> いちいち確認することができない場合に、不正なマージを見つけるのに良い方法ありませんでしょうか?
>
> merge = beyondcompare4 NG
>
> winmergeu.premerge=keep-merge3 OK
>
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
> ---
> このメールは Google グループのグループ「mercurial-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mercurial-ja...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/mercurial-ja/d9e4e453-5645-41d2-aa83-9fb155317cd7%40googlegroups.com にアクセスしてください。



--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

ohira

unread,
Aug 2, 2019, 2:08:09 AM8/2/19
to mercurial-ja
おおひらです。
回答ありがとうございます。


問題が発生した方のmercurial.ini
 [ui]
username= xxx xxxx <xxxxx@xxx.xx>
merge = beyondcompare4
[extensions]
flow = D:\Estore Mercurial\Soft\hgflow.py
strip =
[tortoisehg]
ui.language = en
vdiff = beyondcompare4
fontoutputlog = Roboto Mono,8,-1,5,50,0,0,0,0,0,Regular
[merge-patterns]
**.png = internal:prompt
**.gif = internal:prompt

hg config の結果の内関連する部分

merge-tools.beyondcompare4.args=$local $other $base /mergeoutput=$output /ro /lefttitle=parent1 /centertitle=base /righttitle=parent2 /outputtitle=merged /automerge /reviewconflicts /solo
merge-tools.beyondcompare4.premerge=False
merge-tools.beyondcompare4.regkey=Software\Scooter Software\Beyond Compare 4
merge-tools.beyondcompare4.regkeyalt=Software\Wow6432Node\Scooter Software\Beyond Compare 4
merge-tools.beyondcompare4.regname=ExePath
merge-tools.beyondcompare4.gui=True
merge-tools.beyondcompare4.priority=-1
merge-tools.beyondcompare4.diffargs=/lro /lefttitle='$plabel1' /righttitle='$clabel' /solo /expandall $parent $child
merge-tools.beyondcompare4.diff3args=$parent1 $parent2 $child /lefttitle='$plabel1' /centertitle='$clabel' /righttitle='$plabel2' /solo /ro
merge-tools.beyondcompare4.dirdiff=True
merge-tools.beyondcompare4.dir3diff=True

tortoisehg.vdiff=beyondcompare4

ui.merge=beyondcompare4

(どういう意図でbeyondcompare4を使われているのかはっきりわかりませんが、
日本語読めないそうなのでWinMerge日本語版は使いたくないのかもしれません)


2019年8月1日木曜日 20時56分03秒 UTC+9 FUJIWARA Katsunori:
2019年8月1日(木) 10:19 ohira <shin...@gmail.com>:
>
> いつもお世話になっております。
> おおひらです。
>
> マージツールとしてbeyondcompare4を指定した場合 mercurial本体でマージすれば問題がない部分で問題が発生し
> マージされるべき変更内容が一部消えてしまうことがわかりました。
>
> 回避策としては、beyondcompare4 でのマージをやめて
> keep-merge3でwinmerge を使うことです。
>
>
> マージ時に修正されるファイルや数英箇所が多いため全ての修正が正しくマージされたかを
> いちいち確認することができない場合に、不正なマージを見つけるのに良い方法ありませんでしょうか?
>
> merge = beyondcompare4 NG
>
> winmergeu.premerge=keep-merge3 OK
>
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
> ---
> このメールは Google グループのグループ「mercurial-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mercur...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/mercurial-ja/d9e4e453-5645-41d2-aa83-9fb155317cd7%40googlegroups.com にアクセスしてください。



--
----------------------------------------------------------------------
FUJIWARA Katsunori(flyin...@gmail.com)

ohira

unread,
Aug 2, 2019, 2:23:54 AM8/2/19
to mercurial-ja
おおひらです。

回答ありがとうございます。


2019年8月1日木曜日 20時56分03秒 UTC+9 FUJIWARA Katsunori:
藤原です。

mercurial.ini で premerge は指定していませんが、 送ってもらった hg config の結果では
 merge-tools.beyondcompare4.premerge=False になっているそうです。
自分の環境で hg config を行っても merge-tools.beyondcompare4.premerge=False になっていました。
premerge のデフォルトは False ではないでしょうか?


     a-1: BeyondCompare4 が衝突箇所に対する処理結果が想定外の内容
     a-2: BeyondCompare4 が衝突箇所「以外」に対する処理結果が想定外の内容
ここで言う衝突箇所とは、チェンジセットのことではなさそうですが、
ファイル単位でしょうか? それとも行単位の話でしょうか? 

  b. premerge = false に設定することで、マージでは常に
     BeyondCompare4 を適用

     b-1: 衝突発生時に BeyondCompare4 のマージ結果が想定外の内容
問題が発覚したファイルでコンフリクトが発生した場合でしょうか?
 
     b-2: 衝突「非」発生時に BeyondCompare4 のマージ結果が想定外の内容
こちらは、問題が発覚したファイルでコンフリクトが発生していない場合でしょうか?

 
問題が発覚した promote では、コンフリクトが発生したファイルが多数ありました。
問題が発生した(=変更が取り込まれなかった)ファイルではコンフリクトが発生していませんでした。

 

相談内容での言及的には b-2 のケースではないかと推測しているのです
が、この認識で合ってますか?
衝突の発生時の意味が良くわからないですが、
多分そうだと思います。問題が発覚したファイルではコンフリクトはありませんでした。
問題が発覚したpromoteではコンフリクトを発生したファイルが多数ありました。


 
2019年8月1日(木) 10:19 ohira <shin...@gmail.com>:
>
> いつもお世話になっております。
> おおひらです。
>
> マージツールとしてbeyondcompare4を指定した場合 mercurial本体でマージすれば問題がない部分で問題が発生し
> マージされるべき変更内容が一部消えてしまうことがわかりました。
>
> 回避策としては、beyondcompare4 でのマージをやめて
> keep-merge3でwinmerge を使うことです。
>
>
> マージ時に修正されるファイルや数英箇所が多いため全ての修正が正しくマージされたかを
> いちいち確認することができない場合に、不正なマージを見つけるのに良い方法ありませんでしょうか?
>
> merge = beyondcompare4 NG
>
> winmergeu.premerge=keep-merge3 OK
>
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
> ---
> このメールは Google グループのグループ「mercurial-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mercur...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/mercurial-ja/d9e4e453-5645-41d2-aa83-9fb155317cd7%40googlegroups.com にアクセスしてください。



--
----------------------------------------------------------------------
FUJIWARA Katsunori(flyin...@gmail.com)
Reply all
Reply to author
Forward
0 new messages