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

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

Моя страница настроек в исходном дереве:

введите описание изображения здесь

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

[core]
    excludesfile = /Users/[username]/.gitignore_global
[user] 
    name = ---- -----
    email = [email protected]
[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

person Saren Inden    schedule 11.11.2018    source источник


Ответы (3)


Это случилось со мной, когда diffmerge был установлен через установку pkg вместо установщика. По-видимому, это не настраивает ваш bash на знание команды diffmerge, поэтому вам нужно указать путь к diffmerge (или обновить конфигурацию вашего bin).

Чтобы решить эту проблему, я вручную настроил 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 = [email protected]
[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:

Различия: https://sourcegear.com/diffmerge/webhelp/sec__clargs__diff.html

Объединение: https://sourcegear.com/diffmerge/webhelp/sec__clargs__merge.html

person Saren Inden    schedule 11.11.2018
comment
Обратите внимание, что команда Diff может различаться в зависимости от того, где находится ваш двоичный файл diffmerge, в моем случае это было: /Applications/DiffMerge.app/Contents/MacOS/DiffMerge. - person Osmar; 28.03.2021
comment
Огромное спасибо за --nosplash! - person suomi35; 14.04.2021

Я решил эту проблему, следуя инструкциям на странице документации DiffMerge Настройки для 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\""
person UglyBlueCat    schedule 13.08.2019

У меня такая же проблема. 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 начинает работать.

Слить не пробовал.

person Zhao    schedule 02.11.2020
comment
Если я сделаю это и перезапущу SourceTree, он повторно/установит повторяющуюся часть. Как удалить его навсегда_ - person esbenr; 29.01.2021
comment
@esbenr определяет пользовательский инструмент сравнения, как указано в решении Сарена Индена. Просто скопируйте правильный cmd и аргументы для diffMerge в настройки исходного дерева. - person Zhao; 23.04.2021