Оскільки 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
Оскільки для більшості різних інструментів потрібен інший порядок (і лише деякі) аргументів, вам, швидше за все, доведеться вказати сценарій обгортки, який, в свою чергу, викликає реальний інструмент diff.
Другий спосіб, який я віддаю перевагу, - це налаштувати зовнішній інструмент "diff" через "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)--
Як бачимо, лише інший («старий файл») і п’ятий («новий файл») будуть передані інструменту diff.
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
" потрібен лише для деяких програм, які можуть не повернути належного або послідовного статусу повернення. Ви можете спробувати без кінцевої кішки, якщо ваш інструмент diff має явний статус повернення)
( Діомідіс Спінеліс додає у коментарях :
cat
Команда необхідна, тому що diff(1)
, за замовчуванням виходить з кодом помилки , якщо файли різняться.
Git очікує, що зовнішня програма diff вийде з кодом помилки, лише якщо виникла фактична помилка, наприклад, якщо у неї не вистачає пам'яті.
За допомогою конвеєра маскується вихід git
до cat
ненульового коду помилки.
Більш ефективно, програма може просто запускатися exit
з аргументом 0.)
Це (стаття, цитувана вище) - це теорія для зовнішнього інструменту, визначеного через файл config (не через змінну середовища).
На практиці (все ж для визначення конфігураційного файлу зовнішнього інструменту) можна звернутися до: