Слияние с "git mergetool"

Я нашел git mergetool, чтобы быть удобной утилитой для слияния различий визуально, но способ, которым я занимаюсь, кажется действительно неуклюжим. По сути, мой процесс выглядит так, когда сообщаются конфликты:

  • Выполните git mergetool
  • В командной строке нажмите Ввести, чтобы запустить инструмент diff (Meld или FileMerge, в зависимости от того, на каком компьютере)
  • Устранение конфликтов
  • Сохранить изменения
  • Закройте инструмент diff

Если у меня более одного конфликта, промойте, повторите. Да, что я открываю и закрываю свой diff viewer один раз для каждого конфликта в слиянии. Поскольку он запускается из командной строки, закрытие его - единственный способ сообщить git mergetool, что я разрешил этот конкретный конфликт и что он может перейти к следующему.

Конечно, есть лучший способ, но я понятия не имею. Помогите, пожалуйста? Этот процесс кажется сумасшедшим неэффективным.

Ответ 1

На первый взгляд кажется невозможным повторное использование сеанса внешнего анализа.

В документации git-mergetool четко указано:

Если пользовательский инструмент слияния правильно указывает на успех разрешения слияния с кодом выхода, тогда для переменной конфигурации mergetool.<tool>.trustExitCode может быть установлено значение true. В противном случае git-mergetool предложит пользователю указать успех разрешения после выхода пользовательского инструмента.

Таким образом, необходим код выхода (или проверка пользователя после выхода из инструмента сравнения), подразумевая, что пользователь сначала закрывает инструмент внешней проверки.

Это кажется большим стимулом для уменьшения количества конфликтов при каждом объединении/переустановке одной попытки;) (независимо от используемого инструмента VCScs)

Примечание:
Два других параметра git для внешних настроек инструментов diff ( " Настройка инструментов разворота и слияния для git в Windows" и Настройка SourceGear DiffMerge с Git") не дают больше надежд, когда дело доходит до того, внешний инструмент сравнения...

Ответ 2

Если ваш 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"'

Это работает достаточно хорошо, я могу начать использовать его сам!

Ответ 3

Проблема для mergetool заключается в том, что он намеренно использует интерфейс командной строки для инициирования сеанса слияния, а затем ждет, пока вызываемая команда вернется, чтобы определить, когда завершилось слияние пользователя.

Большинство инструментов объединения не предоставляют механизм командной строки для запуска сеанса слияния в уже запущенном процессе с возможностью определения, когда разрешение было завершено, и было ли оно успешным или нет.

Можно предположить, что некоторые инструменты объединения могут обеспечить эту функциональность с помощью отдельной команды оболочки и своего рода IPC, но она будет чрезвычайно специфичной для инструмента и сложной для реализации в общей программе слияния.