web-dev-qa-db-ja.com

mergetool GUI(KDiff3)を常に表示させるにはどうすればよいですか?

Mergetool GUIを常に表示し、自動解決を無効にするにはどうすればよいですか?

マージ中に競合が発生し、mergetoolを使用すると、ヒットするとすぐに戻ることがあります。 Enter 質問 "リターンを押してマージ解決ツール(kdiff3)を開始する"で、GUIが表示されず、競合が解決されたようです。

現在、mergetoolとして KDiff を使用するようにGitを構成していますが、mergetoolとしてcodecompareを指定している場合にも発生しました。 KDiff3にオプション「競合なしでマージ時に自動保存して終了する」があることは知っていますが、理論的には説明されている動作を引き起こす可能性がありますが、このオプションをすべて無効/オフにします時間。

また、Git mergetool gitconfigに直接trustExitCodeオプションがあり、これをtrueに設定しましたが、falseに設定してもGUIは表示されていません。

とにかく誰が自動解決を行うのかわかりません。いくつかの前処理またはKDiff3のMergetool?

Windowsで実行していて、Git拡張機能をインストールしています。

KDiff3に固有の同様の質問がここでも尋ねられました:Kdiff3はmergetoolコマンドで開きません

29
Ondrej Peterka

GitにはKDiff3のコマンドラインオプションとして--autoがハードコードされています。これにより、すべての競合がKDiff3によって自動解決可能な場合、GUIは表示されません。 KDiff3設定では、無視するコマンドラインオプションを指定できますが、そこに--autoを配置しても機能しませんでした。

回避策として、KDiff3の独自のバリアントをマージツールとして構成しました。

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\""

これは、GitがデフォルトでKDiff3に使用するものと非常に似ていますが、--autoフラグがありません。

これで、git mergetool -t kdiff3NoAutoを呼び出すか、kdiff3NoAutoをmergetoolとしてグローバルに構成でき、競合を解決するときにKDiff3が常に表示されます。

質問の2番目の部分に関して、自動解決を本当に無効にしたい場合は、上記の--qallコマンドラインにkdiff3を追加するだけです。ただし、Gitの競合が発生しなかった場合でも、ファイル内のすべての変更を手動で解決する必要があります。最良のシナリオは次のとおりです。KDiff3は、Gitがファイルをマージし、ユーザーが選択できるように競合を開いたままにする方法を示しています。

31
PiQuer

git mergetoolの動作は、選択したマージツールと、Gitが渡すコマンドラインに完全に依存しています。したがって、その動作を変更するには、必要なことを実行するコマンドラインを見つけて、そのコマンドラインを使用するようにGitを構成する必要があります。

私は自分で(特にKDiff3に関して)この質問をしました、そして PiQuerの答え 私は途中で私を助けました、しかしそれは私に考えさせました。 --autoオプションがない場合を除いて、Gitのデフォルトの動作をKDiff3に対して正確に複製する方法があるはずです(これにより、KDiff3はGUIを表示しません)。

KDiff3マージツールのデフォルトコマンドのソースがファイル git/mergetools/kdiff にあるようです。これはシェルスクリプトのように見えるので、正確にコピーできるはずです。それを1行にまとめ、--autoを削除し、物事をエスケープすると、次のようになります。

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi"

base_present変数とmerge_tool_path変数は、Gitドキュメントでmergetool.<tool>.cmdで使用できると具体的に言及されていないため、将来のある時点で、このコマンドが次のように機能しない可能性があります。 -です。ただし、これらは、BASEが存在するファイルを参照しているかどうかをテストするコマンドと、KDiff3のハードコードされたパスにそれぞれ簡単に置き換えることができます。

上記のコマンドは、個別のコマンドを作成するのではなく、Gitのkdiff3マージツールのデフォルトコマンドを置き換えることに注意してください。

元の質問の他のいくつかの点について:

  • trustExitCode設定は、マージツールの終了コードがマージが成功したかどうかの適切な指標であるかどうかをGitに通知します。マージツールの動作には影響しませんが、マージツールが終了するとGitの動作に影響します。 git-mergetoolのマニュアル を参照してください。
  • git mergetoolと入力した後に表示される自動解決は、すべてマージツール自体によって行われます。 git mergetoolは、マージする必要のあるファイルバージョンで外部ツールを呼び出すだけです。
1
Joel Davies

競合がある場合にのみ呼び出されるmergetoolを構成する代わりに、KDiff3を使用してマージドライバーを設定するだけです。

git config merge.kdiff.driver 'kdiff3  "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor"  -L2 "Working Copy" --L3 "Version from Other Branch"'

--globalを追加することで、このドライバーをグローバルにすることができます。ただし、リポジトリに.gitattributeを追加する必要があります。

*  merge=kdiff
0
sophana

問題が不要な競合の自動解決に厳密に関連している場合...

KDiff3が開いたら、メニューからMerge / Set Deltas to Conflictsを押すだけで、状態が美しく、人間が主導する競合解決の問題に更新されます。

0