4

へのコミットを分析するコードを書いてHgおり、結果を と比較していますTortoiseHgTortoiseHgマージの場合の の動作が理解できません。

でマージ変更セットを選択するとTortoiseHg、ボタンを押さない限り、影響を受けるファイルのリストには競合があったファイルのみが表示され"Show All"ます。Web から収集できる情報と、[すべて表示] ボタンを押すと、リストに表示されるファイルに二重矢印が表示されるという観察結果に基づいて、少なくともそれが意図しているように見えます。

変更セット内の各ファイルを両方の親と比較し、両方の親と異なる場合にのみ分析にファイルを含めることで、それをエミュレートしようとしています。しかし、TortoiseHg がマージの説明に表示するファイルに遭遇しましたが、それは 1 つの親としか異なりません。TortoiseHg同様に、親 1 または 2 と比較すると変化が見られますが、もう一方の親には変化が見られません。

また、オプションを使用して比較を試みましたが、--gitそれが欠落しているメタデータの変更ではないことを確認しましたが、結果はまったく変わりません。

使用している変更セットに関する情報を取得するには:

hg log -v -r <rev> --removed --style xml

マージチェンジセットの親をピックアップし、マージ内の各ファイルに対して、

hg diff -r <parent1> -r <rev> filename
hg diff -r <parent2> -r <rev< filename

TortoiseHgそして、私が報告したマージの概要に、ファイルが競合なしでマージされたと表示されていることがわかりました。

誰でも不一致に光を当てることができますか?

更新: TortoiseHg 自体のソース コードでこれを再現できました。

https://hg01.codeplex.com/tortoisehgから 複製 tortoiseHg でリポジトリを開き、rev 12602 (58eb7c70) を選択します。これは、12599 (6c716caa) と 12601 (39c95a81) の親とのマージです。

TortoiseHg はファイル tortoisehg/hgqt/repowidget.py をマージで唯一の競合ファイルとして表示しますが、まだ

hg diff -r 12599 -r 12602 tortoisehg/hgqt/repowidget.py

何も返しませんが、

hg diff -r 12601 -r 12602 tortoisehg/hgqt/repowidget.py

は、2 つの行が変化していることを示しています。

4

2 に答える 2

2

私は tortoisehg のロジックがここにあることを理解したと思います (確かにソースを確認していませんが)。

ご想像のとおり、tortoise はマージの両側で変更されたファイルを二重矢印で示します。ただし、マージのそれぞれの親 (例:p1(58eb7c70)::58eb7c70およびp2(58eb7c70)::58eb7c70) との差分を単純に調べるわけではありません。代わりに、tortoise は 2 つの親の最後の共通の祖先を比較して、マージで導入されたすべての変更を見つけます。

亀のリポジトリを例に取りましょう。58eb7c70 の祖先のグラフ ビューは次のとおりです。

Jonathan:tortoisehg $ hg log --graph -r ::58eb7c70 -l 5 --template "{node|short}\n{desc|firstline}\n\n"
o    58eb7c70d501
|\   Merge with stable (noop)
| |
| o  39c95a813105
| |  repowidget: show all errors on infobar
| |
| o  da7ff15b4b96
| |  repowidget: limit infobar error messages to 2 lines of up to 140 chars by default
| |
o |  6c716caa11fd
|\|  Merge with stable
| |
| o  48c055ad634f
| |  sync: show non-ascii command-line arguments correctly
| |

ご覧のとおり、マージ 58eb7c70d501 は 2 つの開発ブランチをマージしました。片側に 1 つの変更セット (p1、6c716caa11fd) がありましたが、もう一方には2 つ(p2、39c95a813105、およびその親、da7ff15b4b96) がありました。これらのブランチが分岐したポイントは、p1 と p2 の最後の共通の祖先である 48c055ad634f です。

(最後の共通祖先は で直接見つけることができますhg log -r "last(ancestor(p1(58eb7c70), p2(58eb7c70)))")

これら 2 つのブランチに加えられた変更を見てみましょう。マージの各親を共通の祖先と比較します。

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::6c716caa11fd"
M .hgtags
M tortoisehg/hgqt/commit.py
M tortoisehg/hgqt/compress.py
M tortoisehg/hgqt/hgemail.py
M tortoisehg/hgqt/postreview.py
M tortoisehg/hgqt/purge.py
M tortoisehg/hgqt/rename.py
M tortoisehg/hgqt/repowidget.py
M tortoisehg/hgqt/revset.py
M tortoisehg/hgqt/run.py
M tortoisehg/hgqt/settings.py
M tortoisehg/hgqt/status.py
M tortoisehg/hgqt/sync.py
M tortoisehg/hgqt/visdiff.py
M tortoisehg/util/cachethg.py
M tortoisehg/util/hglib.py

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::39c95a813105"
M tortoisehg/hgqt/repowidget.py

これらは、58eb7c70d501 によって実際にマージされた変更です。2 つのブランチが分岐してからすべてが変更されました。ご覧のとおり、リスト間で共通する唯一のファイル (両方のブランチで変更された唯一のファイル) はtortoisehg/hgqt/repowidget.py、予想どおりです。このファイルは da7ff15b4b96 で変更されていることがわかります。これは、マージの親ではないが、2 つのブランチからマージされた変更にまだ含まれている 1 つの変更セットです。

于 2013-03-17T16:39:27.927 に答える
0

tortoisehg/hgqt/repowidget.py6c716caa11fdで変更されました。これは、2回目の呼び出しで結果が得られる理由を説明していますhg diff。最初の呼び出しでは、変更が登録されていない2つのリビジョンを比較しtortoisehg/hgqt/repowidget.pyます。hg diff私がどのように振る舞うかについて何か他のものを見逃していない限り、これは私には聞こえるようです。

于 2013-03-16T17:23:58.887 に答える