Выберите git mergetool в зависимости от типа файла

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

Аналогичный вопрос был задан здесь: Git: настроить шаблоны для difftool и mergetool и ответом было написать собственный драйвер слияния. Однако похоже, что это будет выполнено на git merge, тогда как я бы хотел, чтобы инструмент слияния был выбран на git mergetool.

Кажется, должен быть какой-то способ указать это с помощью .gitattributes, но я не могу понять, как это сделать. Любой совет?


person elsevers    schedule 26.04.2014    source источник


Ответы (1)


Одно из решений (поскольку мой старый ответ не подходит для mergetool) — установить как mergetool a скрипт-оболочка.

git config --global merge.tool customMergeTool
git config --global mergetool.customMergeTool.cmd 'customMergeTool.sh \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

Этот скрипт-оболочка customMergeTool.sh будет:

  • проверьте, что такое $BASE (в частности, его расширение файла)
  • вызвать соответствующий инструмент слияния на основе этого расширения
  • вернуть статус выхода этого mergetool

Вот, например, сценарий, который придумал OP elsevers: merge-wrapper.

person VonC    schedule 27.04.2014
comment
Хорошая идея! Предположим, что у меня есть набор расширений файлов, для которых сценарий будет вызывать определенные инструменты слияния, указанные через mergetool.xxxx.cmd, а затем у меня есть инструмент слияния по умолчанию, поддерживаемый git (например, p4merge, kdiff3 и т. д.). В случае, если мое расширение соответствует одному из конкретных инструментов слияния, мой скрипт может запустить git config mergetool.xxxx.cmd -- но в случае инструмента слияния, поддерживаемого git, где git вызывает сам инструмент слияния, а cmd не указано, как мой скрипт вызвать инструмент слияния? - person elsevers; 27.04.2014
comment
@elsevers, идея заключалась бы в том, чтобы aways вызвать этот скрипт-оболочку и позволить ему беспокоиться о том, какой инструмент с поддержкой git вызывать. - person VonC; 27.04.2014
comment
Верно - мне просто интересно, есть ли простой способ для скрипта-оболочки узнать, как вызвать инструмент слияния на основе настроек конфигурации git. Например, скрипт-оболочка может знать, что файлы .ex1 должны быть объединены с помощью mergetool.myex1, а затем прочитаны git config mergetool.myex1.cmd, что позволит проекту переопределить, какой инструмент слияния вызывается в его локальном .gitconfig. Все это выглядит нормально, когда указано cmd, но как быть, когда указано только path? Возможно, решение в том, что при использовании этого скрипта-обертки в файле конфигурации всегда должно быть указано cmd... - person elsevers; 27.04.2014
comment
Примечание @elsevers: чтение конфигурации — это просто получение результата команды git config mergetool.myex1.cmd. Если вы можете определить расширение объединяемого файла в одном из аргументов оболочки инструмента слияния (например, $BASE), этого должно быть достаточно для вызова правильного инструмента. - person VonC; 27.04.2014
comment
Большое Вам спасибо. У меня сейчас работает мой скрипт. - person elsevers; 27.04.2014
comment
@elsevers Отлично. У вас есть где-нибудь версия (например, суть на GitHub), чтобы я мог сослаться на нее в ответе? - person VonC; 27.04.2014
comment
Извините, я не... Я немного новичок в интернет-сообществе. Если бы у меня была учетная запись github, загрузил бы я свой скрипт в суть, а затем вы бы сослались на него в своем ответе? - person elsevers; 27.04.2014
comment
@elsevers, это идея, да. - person VonC; 27.04.2014
comment
@elsevers Отлично. Я включил его в ответ для большей наглядности. - person VonC; 27.04.2014