Как сделать gvimdiff открытым через git mergetool открыть все файлы сразу в вкладках?

Обычно git -c merge.tool=gvimdiff mergetool открывает файлы, которые должны быть объединены одним, в пакетном режиме:

Normal merge conflict for '...':
  {local}: modified file
  {remote}: modified file
4 files to edit
... seems unchanged.
Was the merge successful? [y/n] n
merge of ... failed
Continue merging other unresolved paths (y/n) ? y
Normal merge conflict for '...':
  {local}: modified file
  {remote}: modified file
4 files to edit
modules ... seems unchanged.
Was the merge successful? [y/n] n
merge of modules ... failed
Continue merging other unresolved paths (y/n) ? n

Как мне открыть все файлы на одном, с вкладками (например, в gvim -p file1 file2), которые содержат четыре панели для каждого файла, который будет объединен?

Ответ 1

git mergetool поток предназначен для разрешения конфликтов в одном файле за раз. Следовательно, то, о чем вы просите, не может быть сделано чистым способом. Однако можно создать собственный mergetool, который будет накапливать входные данные из git mergetool в одном окне gvim. Хак, который неизбежно должен содержать это "решение", состоит в том, что он должен сделать поток git mergetool уверенным, что пользовательский mergetool успешно объединил файл, хотя он только что открыл файл в gvim. Это необходимо, так что поток git mergetool переходит к следующему файлу без каких-либо вопросов. В результате, если вы выйдете из gvim без каких-либо изменений, git все равно будет думать, что все конфликты были разрешены.

Ниже приведена черновик версии такого настраиваемого метода слияния (который открывает файлы в разных окнах gvim, а не в вкладках):

.gitconfig

[mergetool "mygvimdiff"]
    cmd=/path/to/mygvimdiff "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
    trustExitCode=true

mygvimdiff

#!/bin/bash

gvim -d -c "wincmd J" "[email protected]"

# wait till gvim loads the temporary files before
# the git mergetool script deletes them
sleep 1

exit 0

Использование

git mergetool -t mygvimdiff