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


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

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

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

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

3   51   2009-02-25 15:44:04

3 ответа:

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

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

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

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

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

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

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

% 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"'

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

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

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

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