Sourcetree не может открыть Diffmerge для конфликтов слияния

Недавно у меня была свежая установка macOS. Я установил Sourctree и diffmerge и установил diffmerge в качестве инструмента слияния по умолчанию. По какой-то причине каждый раз, когда я выбираю "Разрешить конфликты -> Открыть инструмент внешнего слияния", исходное дерево открывает окно ожидания и сразу закрывает его.

Моя страница настроек в sourcetree:

Вот как выглядит мой корневой.gitconfig, когда sourcetree настраивает diff для меня:

[core]
    excludesfile = /Users/[username]/.gitignore_global
[user] 
    name = ---- -----
    email = -----@-----.--
[commit]
    template = /Users/[username]/.stCommitMsg
[credential]
    helper =  !/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -Ddebug=false -Djava.net.useSystemProxies=true -jar /usr/local/Cellar/git-credential-manager/2.0.4/libexec/git-credential-manager-2.0.4.jar

[difftool "DiffMerge"]
[mergetool "DiffMerge"]
[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /usr/local/bin/diffmerge \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = /usr/local/bin/diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
[difftool "sourcetree"]
    cmd = /Applications/DiffMerge.app/Contents/MacOS/DiffMerge/Contents/MacOS/DiffMerge --nosplash \"$LOCAL\" \"$REMOTE\"
path = 
[mergetool "sourcetree"]
    cmd = /Applications/DiffMerge.app/Contents/MacOS/DiffMerge/Contents/MacOS/DiffMerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
    trustExitCode = true

1 ответ

По какой-то причине исходное дерево устанавливает неверный путь для аргумента командной строки.

Чтобы решить эту проблему, я вручную настроил Visual Diff Tool и Merge Tool.

Страница настроек в исходном дереве

разность

Команда: /usr/local/bin/diffmergeаргументы --nosplash "$LOCAL" "$REMOTE"

сливаться

Команда: /usr/local/bin/diffmergeаргументы --nosplash --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"

Аргумент --nosplash является необязательным, но предотвращает (на мой взгляд, бесполезный) всплывающее окно, которое всегда нужно закрывать, прежде чем вы сможете начать работу.

Конфигурационный файл Git:

[core]
    excludesfile = /Users/[username]/.gitignore_global
[user]
    name = ---------
    email = ---------@------.--
[commit]
    template = /Users/[username]/.stCommitMsg
[credential]
    helper = !/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -Ddebug=false -Djava.net.useSystemProxies=true -jar /usr/local/Cellar/git-credential-manager/2.0.4/libexec/git-credential-manager-2.0.4.jar

[difftool "DiffMerge"]
[mergetool "DiffMerge"]
[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /usr/local/bin/diffmerge \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = /usr/local/bin/diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
[difftool "sourcetree"]
    cmd = /usr/local/bin/diffmerge --nosplash \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /usr/local/bin/diffmerge --nosplash --merge --result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
    trustExitCode = true

Больше информации об аргументах командной строки diffmerge:

Diff: https://sourcegear.com/diffmerge/webhelp/sec__clargs__diff.html

Слияние: https://sourcegear.com/diffmerge/webhelp/sec__clargs__merge.html

Я решил эту проблему, следуя инструкциям на странице документации DiffMerge Settings для OS X, которая была:

Сначала подтвердите, что /usr/local/bin/diffmergeнастоящее. Если вы использовали установщик PKG, он был установлен при установке /Applications/DiffMerge.app. Если вы использовали файл DMG, обратитесь к инструкциям по установке дополнительных компонентов.

Следующие команды обновят ваш .gitconfig чтобы GIT использовал DiffMerge:

$ git config --global diff.tool diffmerge
$ git config --global difftool.diffmerge.cmd
    "/usr/local/bin/diffmerge \"\$LOCAL\" \"\$REMOTE\""

$ git config --global merge.tool diffmerge
$ git config --global mergetool.diffmerge.trustExitCode true
$ git config --global mergetool.diffmerge.cmd 
    "/usr/local/bin/diffmerge --merge --result=\"\$MERGED\"
        \"\$LOCAL\" \"\$BASE\" \"\$REMOTE\""

Затем я смог использовать DiffMerge, выбрав пункт меню в Sourcetree.

(Необязательно) Вы можете добавить--nosplashк обеим командам, перед другими параметрами, чтобы избежать экрана-заставки (как также рекомендуется Saren Inden). т.е.

$ git config --global diff.tool diffmerge
$ git config --global difftool.diffmerge.cmd
    "/usr/local/bin/diffmerge --nosplash \"\$LOCAL\" \"\$REMOTE\""

$ git config --global merge.tool diffmerge
$ git config --global mergetool.diffmerge.trustExitCode true
$ git config --global mergetool.diffmerge.cmd 
    "/usr/local/bin/diffmerge --nosplash --merge --result=\"\$MERGED\"
        \"\$LOCAL\" \"\$BASE\" \"\$REMOTE\""

У меня такая же проблема. DiffMerge также не запускается, когда я нажимаю External Diff.

Проблема, похоже, заключается в пути DiffMerge в файле .gitconfig:cmd = /Applications/DiffMerge.app/Contents/MacOS/DiffMerge/Contents/MacOS/DiffMerge ....

Если вы проверите путь /Applications/DiffMerge.app/Contents/MacOS/DiffMerge, на самом деле это не каталог, а файл. Кажется, SourceTree добавляет /Contents/MacOS/DiffMergeдважды по пути. Я удалил повторяющуюся часть, и External Diff начал работать.

Не пробовал объединить.

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