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コマンドで開きません
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がファイルをマージし、ユーザーが選択できるように競合を開いたままにする方法を示しています。
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
は、マージする必要のあるファイルバージョンで外部ツールを呼び出すだけです。競合がある場合にのみ呼び出される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
問題が不要な競合の自動解決に厳密に関連している場合...
KDiff3が開いたら、メニューからMerge / Set Deltas to Conflicts
を押すだけで、状態が美しく、人間が主導する競合解決の問題に更新されます。