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.
2) В окне типа Git Bash pwd
, который покажет вам текущий рабочий каталог. Щелкните правой кнопкой мыши заголовок окна и выберите " Отметить". С помощью мыши выберите путь (в моем случае это /C/Users/lpiepiora/cmds
и нажмите Enter.
3) Теперь отредактируйте свой .gitconfig
и добавьте скопированный путь к нему (вы должны добавить дополнительную косую черту в конце скопированного пути).
После этого вы сможете запустить инструмент слияния.
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 для окон, позволяющая сделать слияние как инструмент сравнения, будьте осторожны с"