Начиная с 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
инструмент, т.е. использовать косую черту вместо обратной косой черты. В моем случае у меня есть
[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.)
Это (статья, приведенная выше) является теорией для внешнего инструмента , определенной через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента), вы можете обратиться к: