3

KDiff3 は標準の diff 競合マーカーを解釈できますか?

説明:

現在、Mercurial のマージ ツールとして KDiff3 をセットアップしています。ターミナル セッションからマージ (例: hg merge) を実行し、競合が発生すると、予想どおり、Mercurial は 3 ウェイ マージのために KDiff3 を呼び出します。

私がやりたいことは、最初に Mercurial の内部merge3アルゴリズムを使用し、ファイルに競合マーカーを残してから、(一度にすべてのマージを完了しようとするのではなく) 個々のファイルを自由に解決することです。

解決コマンド (例: ) にマージ ツールを渡したいのですが、hg resolve --tool kdiff3 file.txtKDiff3 は競合マーカーを処理せず、代わりにコマンド ライン引数として 3 つのファイルを指定する必要があるようです。

私がやりたいことをする方法はありますか?競合マーカーを手動で編集するよりも、GUI で差分を確認したいです。

4

1 に答える 1

2

あなたが何をしたいのか正確にはわかりません。推測なので間違っていたらごめんなさい。

まず、ほとんどすべてのマージ ツールは、マージを実行するために 2 つまたは 3 つのファイルを必要とします。これが、これらのツールの設計方法です。競合マーカーを含むファイルを直接操作するツールは非常にまれです。ただし、これは、これを行うツールの選択次第です。それが必要な場合、Mercurial と kdiff3 は役に立ちません。別のツールが必要になります。

次に、マージ ツールがどのように構成されているかを詳しく見てみましょう。hg help mergetools使用可能なマージ ツールのリストとその選択方法、およびhg help config.merge-tools(ダッシュに注意してください) 必要な構成パラメーターを確認できます。次のようにして、kdiff3 の設定を確認できます。

hg config merge-tools | grep -w kdiff3

デフォルトでは、merge-tools.kdiff3.premerge設定すべきではないため、hg merge最初に内部マージ アルゴリズムを使用して競合を解決しようとし、競合なしに解決できないファイルに対してのみ kdiff3 (マージ ツールとして選択したと仮定) にフォールバックします。kdiff3 がどのように呼び出されるかは、次のようにして確認できます。

hg config merge-tools.kdiff3.args

ここでのデフォルトは、すでにあなたが望むものにかなり近いはずです. ここで、kdiff3 をデフォルトで起動したくないが、kdiff3 がいつ呼び出されるかを制御したい、と想定しています。

競合が発生した場合にデフォルトでマージ ツールにダンプされたくない場合にできることは、最初に内部ツールの 1 つを使用してマージすることです:merge:merge3、または:fail:mergeまたはは、内部的にマージ:merge3できないファイルに競合マーカーを配置し、マージできるファイルを解決済みとしてマークし、残りを未解決としてマークします。マージ ツールは、競合が解決でき:failたとしても、両側に変更があるすべてのファイルを未解決としてマークします(競合マーカーは追加されません)。これは、たとえば次の方法で実行できます。

hg merge --tool :merge

この時点で、Mercurial の内部マージ ツールが解決できた競合と、解決できなかった競合があります (hg resolve -l状態を確認するかhg resolve -l -T '{ifeq(status,"U","{path}\n","")}'、未解決のファイルを一覧表示するだけです)。

その後、 を呼び出しhg resolve --tool kdiff3 FILEて ( --tool kdiff3kdiff3 がデフォルトのマージ ツールである場合はオプションを省略できます)、 の競合を解決できますFILE。Mercurial は、マージ ツールを呼び出す前に、ローカル、ベース、およびその他のリビジョンを生成します。このプロセスの一環として、ローカル ファイル内の競合マーカーは消去されます。これは、そのファイルが作業ディレクトリの最初の親の新しいコピーに置き換えられるためです。

于 2015-12-14T12:45:01.050 に答える