Начиная с Git1.6.3, вы можете использовать скрипт git difftool : см. Мой ответ ниже .
Может быть, это статья поможет вам. Вот лучшие части:
Есть два разных способа указать внешний инструмент сравнения.
Первый - это метод, который вы использовали, установив переменную GIT_EXTERNAL_DIFF. Однако предполагается, что переменная указывает на полный путь к исполняемому файлу. Кроме того, исполняемый файл, указанный в GIT_EXTERNAL_DIFF, будет вызываться с фиксированным набором из 7 аргументов:
path old-file old-hex old-mode new-file new-hex new-mode
Поскольку большинству инструментов сравнения потребуется другой порядок (и только некоторые) аргументов, вам, скорее всего, придется вместо этого указать скрипт-обертку, который в свою очередь вызывает реальный инструмент сравнения.
Второй метод, который я предпочитаю, это настроить внешний инструмент сравнения с помощью «git config» . Вот что я сделал:
1) Создайте скрипт-обертку "git-diff-wrapper.sh", который содержит что-то вроде
-->8-(snip)--
#!/bin/sh
# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode
"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--
Как видите, только второй ("старый файл") и пятый ("новый файл") аргументы будут переданы в инструмент сравнения.
2) Тип
$ git config --global diff.external <path_to_wrapper_script>
в командной строке, заменив путь к «git-diff-wrapper.sh», поэтому ваш ~ / .gitconfig содержит
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
Обязательно используйте правильный синтаксис, чтобы указать пути к сценарию-оболочке и инструменту сравнения, т. Е. Используйте прямую косую черту вместо обратной косой черты. В моем случае у меня есть
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
в .gitconfig и
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
в сценарии оболочки. Следите за "котом"!
(Я полагаю, что ' | cat
' необходимо только для некоторых программ, которые могут не возвращать правильный или непротиворечивый статус возврата. Вы можете попробовать без завершающего кота, если ваш инструмент сравнения имеет явный статус возврата)
( Диомидис Спинеллис добавляет в комментариях :
Команда cat
обязательна, потому что diff(1)
по умолчанию выходит с кодом ошибки, если файлы различаются.
Git ожидает, что внешняя программа сравнения завершит работу с кодом ошибки, только если произошла фактическая ошибка, например, если она исчерпала память.
По конвейеру от git
к cat
коду ненулевой ошибки маскируются.
Более эффективно, программа могла бы просто работать exit
с аргументом 0.)
Это (статья, приведенная выше) является теорией для внешнего инструмента, определенного через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента), вы можете обратиться к: