Слияние с "git mergetool" - PullRequest
       27

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

52 голосов
/ 25 февраля 2009

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

  1. Выполнить git mergetool
  2. В командной строке нажмите Введите , чтобы запустить мой инструмент сравнения (Meld или FileMerge, в зависимости от того, какой компьютер)
  3. Разрешить конфликты
  4. Сохранить изменения
  5. Закрыть инструмент сравнения

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

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

Ответы [ 3 ]

34 голосов
/ 25 февраля 2009

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

Документация git-mergetool четко гласит:

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

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

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

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

22 голосов
/ 25 февраля 2009

Если выбранный вами 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"'

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

12 голосов
/ 25 февраля 2009

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

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

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

...