Git difftool не запускает внешнюю программу DiffMerge

В этом ответе я следовал указаниям, указанным в ссылке " Запись в блоге Дейва ", поскольку я работаю в Windows 7 и использую инструмент SourceGear DiffMerge. Я добавил git\cmd каталог моей системной переменной PATH и положить мой git-diff-diffmerge-wrapper.sh файл там:

#!/bin/sh
"C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat

(Да, это правильный путь для DiffMerge.)

Я отредактировал мой .gitconfig файл для включения diff а также difftool чанки (я скопировал строки прямо из поста, а он ушел в закомментированный #external линия. Я добавил это в конец моего файла; это нормально?)

[diff]
    # external = git-diff-wrapper.sh
    tool = diffmerge
[difftool "diffmerge"]
    cmd = git-diff-diffmerge-wrapper.sh "$LOCAL" "$REMOTE"

Итак, я иду в git bash и делать git difftool HEAD~ 67b8679 -- js/site/pizzabuilder.js и нажмите ввод. Ничего не произошло. Если я сделаю git difftool HEAD~ 67b8679оставив файл, который я хочу, я получаю это:

Viewing: 'js/angular/hutlovers/hutlovers.js'
Launch 'diffmerge' [Y/n]: Y
C:\Program Files (x86)\Git/libexec/git-core/mergetools/defaults: line 17: git-diff-diffmerge-wrapper.sh: command not found

Viewing: 'js/angular/localization/StoreListCtrl.js'
Launch 'diffmerge' [Y/n]: n

Viewing: 'js/pizzahut/site/browser_version.js'
Launch 'diffmerge' [Y/n]: n

Viewing: 'js/pizzahut/site/dashboard.js'
Launch 'diffmerge' [Y/n]: n

Это продолжается для всех файлов, которые отличаются между коммитами, но никогда не запускает DiffMerge. Я не знаю, как интерпретировать ошибку; какая команда не найдена? difftool? Я запускаю 1.7.11 в Git, и difftool предположительно включен в git начиная с версии 1.6.3.

Когда я смотрю на строку 17 файла, на который ссылается ошибка, вот что там:

( eval $merge_tool_cmd )

как часть этого блока:

diff_cmd () {
    merge_tool_cmd="$(get_merge_tool_cmd "$1")"
    if test -z "$merge_tool_cmd"
    then
        status=1
        break
    fi
    ( eval $merge_tool_cmd )
    status=$?
    return $status
}

Может кто-нибудь мне помочь? Я ежедневно пользуюсь git, но вряд ли опытный пользователь, и я ничего не знаю о сценариях оболочки Windows, поэтому следование указаниям в этом посте в значительной степени ограничивает мои знания на данный момент.

5 ответов

Решение

DiffMerge

Не уверен, что это хорошо поможет, но это моя конфигурация для difftool с DiffMerge. Обратите внимание, что я использую msysgit Bash (не уверен, будет ли он другим для пользователей Cygwin или PoshGit):

[diff]
    tool = dm
[difftool "dm"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

В настоящее время я использую Git 2.0, но мне кажется, что я вспомнил, что настроил его на Git 1.8.x или, может быть, даже на Git 1.7.x, так что попробуйте и посмотрите, работает ли он.

Бонус с Beyond Compare 3 Pro

На самом деле я в основном делаю свои эксперименты в Windows с Beyond Compare 3 Pro, хотя иногда я все равно буду использовать DiffMerge. Вот все мои difftool Настройки, если вы хотите сделать переключатель:

[merge]
    tool = bc3
[diff]
    tool = bc3
[difftool "dm"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[difftool "bc3"]
    cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
[mergetool "bc3"]
    cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""

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


Убедитесь, что элементы отображаются с git diff !

У меня было очень простое изменение одной строки. Сделал git add . а затем был прерван. Вернулся, чтобы закончить и решил перепроверить различия. Я не понимал, что делать git add остановит меня от возможности использовать git difftool,

Делать git reset позволил git difftool работать.

Ни один из других ответов не работал для меня. Наконец-то я начал работать с Windows 7,8,10, используя Git 2.6.3, 2.7.0

1) Убедитесь, что вы можете писать и использовать свой глобальный.gitconfig, хранящийся в ~/.gitconfig, который связан с вашим HOME-путем.

Использование:

git config --global --edit

или просто перейдите к файлу в проводнике Windows и отредактируйте его таким образом.

Переменную HOME можно установить, перейдя к переменным среды в окнах (для 7 щелкните правой кнопкой мыши Компьютер -> Свойства -> Дополнительные параметры системы -> Переменные среды).

2) Убедитесь, что diffmerge находится в переменной PATH на вашем компьютере. Это в том же месте, что и переменная HOME. Я добавил это в мой путь:

C:\Program Files\SourceGear\Common\DiffMerge;

3) Чтобы сделать diffmerge значением по умолчанию, добавьте следующее в ваш глобальный файл.gitconfig:

[merge]
    tool = diffmerge
[mergetool]
    prompt = true
[mergetool "diffmerge"]
    path = C:\\Program Files\\SourceGear\\Common\\DiffMerge\\sgdm.exe

'\' - это escape-символ

Повторите для difftool, и это все, что мне нужно, чтобы все заработало. Сценарий-обертка или локальные переменные не нужны.

Пользователи SourceTree: Это может быть вашей проблемой.

Одна возможность для пользователей SourceTree, сталкивающихся с проблемой, описанной в этом вопросе: если у вас возникла эта проблема из-за щелчка правой кнопкой мыши в SourceTree и запуска внешнего инструмента слияния (который внутренне выполняет что-то вроде git mergetool sourcetree), существует ошибка SourceTree, которая приводит к ее зависанию при разрешении конфликта, когда одна сторона файла была удалена.

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

Вы можете подтвердить это, открыв терминал и запустив:

git mergetool

Вы увидите что-то вроде следующего:

Deleted merge conflict for 'Stuff/Other/Thingamajig.js':
  {local}: modified file
  {remote}: deleted
Use (m)odified or (d)eleted file, or (a)bort? 

Это пнул мой зад более часа, в течение которого я остановился на этом ТАКОМ вопросе, поэтому я оставляю свои выводы в этом ответе, чтобы помочь следующей бедной душе, которая может стать жертвой этой ошибки.

(Если вы столкнулись с этой проблемой, рассмотрите, пожалуйста, следующую ссылку и проголосуйте за ошибку SourceTree, чтобы Atlassian почувствовал масштаб влияния этой проблемы.)

Мне кажется, что проблема в том, что путь, который использует git bash, не тот, который использует Windows. Я проверил это, запустив env | grep PATH изнутри Git Bash.

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

Вы должны дать его в формате cygwin. Как это сделать?

1) Идите к месту, где у вас есть обертка, и запустите там Git Bash.

Шаг 1

2) В окне типа Git Bash pwd, который покажет вам текущий рабочий каталог. Щелкните правой кнопкой мыши заголовок окна и выберите " Отметить". С помощью мыши выберите путь (в моем случае это /C/Users/lpiepiora/cmds и нажмите Enter.

Шаг 2

3) Теперь отредактируйте свой .gitconfig и добавьте скопированный путь к нему (вы должны добавить дополнительную косую черту в конце скопированного пути).

Шаг 3

После этого вы сможете запустить инструмент слияния.

PS. Вы можете изменить свой git-diff-diffmerge-wrapper.sh что-то в этом роде, чтобы обрабатывать правильно удаленные / добавленные файлы, как это было предложено в ответе на другой вопрос.

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $1"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $2"
else
    echo "changed: $3"
    "C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat
fi
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = "\"C:\\Program Files (x86)\\Meld\\Meld.exe\" \"$LOCAL\" \"$REMOTE\""

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

Другие вопросы по тегам