atlassian-sourcetreediffmerge

Sourcetree fails to open Diffmerge for merge conflicts


Recently I had a fresh install of macOS. I've installed Sourctree and diffmerge and set diffmerge as the default merge tool. For some reason everytime when I select 'Resolve Conflicts -> Open External Merge Tool' sourcetree opens its waiting view and directly closes it.

My settings page in sourcetree:

enter image description here

This is how my root .gitconfig looks like when sourcetree configures diff merge for me:

[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

Solution

  • This happend to me when diffmerge was installed via the pkg install instead of the installer. This appearantly does not configure your bash to know the command diffmerge so than you have to set the path to the diffmerge (or update your bin config).

    To solve this I manually configured Visual Diff Tool and Merge Tool (with as benefit that you can disable that annoying splash screen on launch everytime).

    Settings page in sourcetree

    enter image description here

    Diff

    Command: /usr/local/bin/diffmerge Arguments --nosplash "$LOCAL" "$REMOTE"

    Merge

    Command: /usr/local/bin/diffmerge Arguments --nosplash --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"

    The --nosplash argument is optional but prevents the (in my opinion useless) pop up that you always have to close before you can start your work.

    Git config file:

    [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
    

    More info about diffmerge command line arguments:

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

    Merge: https://sourcegear.com/diffmerge/webhelp/sec__clargs__merge.html