web-dev-qa-db-ja.com

ファイル間でエディターを閉じることなく、「git mergetool」との複数の競合を解決するにはどうすればよいですか?

git mergetoolは差分を視覚的にマージするための便利なユーティリティであることがわかりましたが、その方法は本当に不安定です。基本的に、競合が報告されると、私のプロセスは次のようになります。

  1. git mergetoolを実行します
  2. プロンプトで、Enterを押して、diffツール(MeldまたはFileMerge、コンピューターに応じて)を起動します。
  3. 競合を解決する
  4. 変更を保存する
  5. 差分ツールを閉じます

複数の競合がある場合は、すすぎ、繰り返します。ええ、それは私がマージの競合ごとに差分ビューアーを一度開いたり閉じたりすることです。コマンドラインから起動されるため、この特定の競合を解決し、次の手順に進むことができることをgit mergetoolに伝える唯一の方法は、閉じることです。

確かにもっと良い方法はありますが、私にはわかりません。助けてください?このプロセスは非常に非効率的です。

53
Rob Wilkerson

選択したmergetoolが既存のインスタンスでファイルを開くことをサポートしている場合、git configでコマンドを指定できます。

% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE'
% git config merge.tool whatever_you_want

git mergetoolは、カスタムコマンドを実行し、ファイルが正常にマージされたかどうかを確認します(終了コードを確認する代わりに)。

Vimdiffのために一緒にハックした例:

% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"'

これは十分に機能します。自分で使い始めるかもしれません!

22
Brian Phillips

Mergetoolの問題は、意図的にコマンドラインインターフェイスを使用してマージセッションを開始し、呼び出されたコマンドが戻ってユーザードリブンマージの完了を判断するのを待つことです。

ほとんどのマージツールは、既に実行中のプロセスでマージセッションを開始するためのコマンドラインメカニズムを提供していません。また、解決が完了したときと成功したかどうかを判断する方法があります。

いくつかのマージツールは、別個のラッパーコマンドと何らかのIPCを介してこの機能を提供できると考えられますが、非常にツール固有であり、一般的なmergetoolプログラムで実装するのは困難です。

12
CB Bailey