8

Mercurialとのマージを実行する場合、競合するファイルを一度に1つずつマージする必要がありますが、これは大規模なマージセットでの生産的なワークフローではありません。代わりに、私がやりたいのは、両方のヘッドのチェンジセット全体をマージすることです(kdiff3を使用して2つのヘッドを比較するなど)。私にはそれは簡単に聞こえますが、それを達成する方法を理解することはできません。

これまでのところ、私が得ることができる最も近い方法は、通常の方法でマージを実行し、すべての競合を未解決のままにして(一度に1つのファイル...)、次にhg vdiff -rHead1 -rHead2-しかしvdiff(kdiff3を使用)にはオプションがないようですツールに出力ディレクトリ(現在の作業ディレクトリ)を渡し、代わりに出力ディレクトリを一時ディレクトリとして起動します(おそらく-oが答えですか?)。

別の言い方をすれば、kdiffを使用して2つのヘッドを作業ディレクトリにマージしたいと思います。作業ディレクトリの結果を、コミットできるマージにしたいと思います。

私は明白な何かを見逃しているに違いありません、これをしたいのは私だけではありません。

4

5 に答える 5

4

私は自分が望むものを達成する解決策を思いつきましたが、それでもそれは面倒だと感じています。

  • MineとTheirsの2つのヘッドを持つ空の作業ディレクトリから始めます。
  • 作業ディレクトリを Mine に更新します。
    hg update [My head's rev here]
  • マージを実行しますが、マージ ツールを起動せずに Merc が自動的に処理できないすべてのファイルを失敗させ、競合が発生した場合に「マイ」ファイルを保持します。
    hg --config "ui.merge=internal:fail" merge

マージ/失敗の詳細については、 https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742を参照してください。

これで、auto が把握できる限りの作業ディレクトリができましたが、未処理のファイルはまだ Mine から変更されていません。(現在のファイルの Mercurial の解決ステータスを表示するには、hg resolve -l を使用します)

  • これで、自分の作業ディレクトリを彼らのヘッドに対して vdiff できるようになりました。これにより、探していた高レベルのチェンジセットからチェンジセットへのマージが可能になります。

hg vdiff -r [Theirs head's rev here]

注: vdiff に WinMerge を使用している場合は、サブディレクトリの比較を行うオプションとして /r スイッチがあることを確認してください。WinMerge 構成が Tree-View を使用するように設定されている場合は、優れたツリー比較が行われます。Mercurial.ini から:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

これで、未解決のファイルを含むディレクトリ全体を操作し、必要に応じてプロジェクト全体に変更を加えることができます (つまり、あるファイルを解決するには、別のファイルに追加の変更が必要になる場合があります)。

  • 完了したら、resolve を使用して Merc 用に解決されたすべてのファイルをマークし、コミットします。
    hg resolve -m

うわー!これが他の誰かに役立つことを願っています!

于 2009-06-17T13:13:12.750 に答える
3

#mercurial数日前に irc.freenode.net で質問を中継しました。mpm(Mercurial の作成者) はある種の答えを出しました (それは答えの半分にすぎなかったので、ここではすぐには伝えませんでした)。彼は、Mercurial にファイルを自動的にマージさせる (競合がある場所にマーカー<<<<とマージ マーカーを挿入する) ことができるかもしれないと言いました。>>>>

次に、これらのマーカーを認識しているマージ ツールを使用します。これにより、ファイルごとに行うのではなく、すべてを一度に解決できます。出発点は、マージ ツールの構成に関するページです。それはそれを説明します

[うい]
マージ = 内部:マージ

Mercurial にマージ マーカーを挿入させます。ここでは、2 つのファイルx.txtを作成してテストしy.txt、2 つのクローンで競合する変更を加えて修正しました。マージは単に与えました:

% hg マージ
x.txt のマージ
警告: マージ中に競合が発生しました。
x.txt のマージに失敗しました!
y.txt のマージ
警告: マージ中に競合が発生しました。
y.txt のマージに失敗しました!
0 個のファイルが更新され、0 個のファイルがマージされ、0 個のファイルが削除され、2 個のファイルが未解決です
「hg resolve」を使用して未解決のファイル マージを再試行するか、「hg up --clean」を使用して中止します

すべてのファイルは一度に処理されました。あなたが説明したように、ファイルごとに何も確認する必要はありませんでした。

ファイルには、次のようなマージ マーカーが含まれるようになりました。

% cat x.txt
foo
<<<<<<< local
hehe
=======
foobar
>>>>>>> other

次のステップは、そのようなファイルを含むディレクトリ ツリーを取得して解決できるツールを見つけることです。kdiff3 を見ましたが、それを使用して単一のファイルを単独で操作する方法がわかりませんでした。ファイル/ディレクトリのペアを比較することに非常に重点を置いているようです。

この半分の答えがどれだけ役立つかはわかりませんが、この時点で行き詰まったのではないでしょうか? しかし、マージ マーカーをすべてのファイルに挿入し、手動で競合を解決したいという他の人に役立つことを願っています。

于 2009-06-03T09:41:16.740 に答える
1

これはあなたの質問に答えると思います。

于 2009-06-03T00:58:33.257 に答える
0

extdiffコマンドが必要なようです:

~/.hgrc にこれらがあります (meld の方が好みですが、kdiff3 などに変更できます)

[extensions]
hgext.extdiff =

[extdiff]
# add new command called meld, runs meld (no need to name twice)
cmd.meld =

マージはextdiff作業ディレクトリで行われ、さらに -o を使用して追加のパラメーターを diff プログラムに渡すことができます。

$ hg help extdiff

hg extdiff [オプション]... [ファイル]...

外部プログラムを使用してリポジトリ (または選択したファイル) を比較します

Show differences between revisions for the specified files, using
an external program.  The default program used is diff, with
default options "-Npru".

To select a different program, use the -p option.  The program
will be passed the names of two directories to compare.  To pass
additional options to the program, use the -o option.  These will
be passed before the names of the directories to compare.

When two revision arguments are given, then changes are
shown between those revisions. If only one revision is
specified then that revision is compared to the working
directory, and, when no revisions are specified, the
working directory files are compared to its parent.

オプション:

-p --program 実行する比較プログラム
-o --option 比較プログラムにオプションを渡す
-r --rev リビジョン
-I --include 指定されたパターンに一致する名前を含める
-X --exclude 指定されたパターンに一致する名前を除外する

于 2009-06-09T08:45:56.373 に答える
0

ui.merge を設定してみてください。詳しくはこちらのページをご覧ください。

于 2009-04-29T22:43:40.803 に答える