【问题标题】:Sourcetree fails to open Diffmerge for merge conflictsSourcetree 无法为合并冲突打开 Diffmerge
【发布时间】:2018-11-11 14:50:15
【问题描述】:

最近我全新安装了 macOS。我已经安装了 Sourctree 和 diffmerge 并将 diffmerge 设置为默认的合并工具。出于某种原因,每当我选择“解决冲突 -> 打开外部合并工具”时,源树都会打开它的等待视图并直接关闭它。

我在 sourcetree 中的设置页面:

当 sourcetree 为我配置差异合并时,我的根 .gitconfig 是这样的:

[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

【问题讨论】:

    标签: atlassian-sourcetree diffmerge


    【解决方案1】:

    当通过 pkg install 而不是安装程序安装 diffmerge 时,我发生了这种情况。这显然不会配置您的 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 = ---------@------.--
    [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

    【讨论】:

    • 请注意,“Diff 命令”可能会根据您的 diffmerge 二进制文件所在的位置而有所不同,在我的例子中,它是:/Applications/DiffMerge.app/Contents/MacOS/DiffMerge
    【解决方案2】:

    我按照 DiffMerge Settings for OS X 文档页面上的说明解决了这个问题,该页面是:

    首先确认/usr/local/bin/diffmerge 存在。 如果您使用 PKG 安装程序,则它是在安装 /Applications/DiffMerge.app 时安装的。 如果您使用 DMG 文件,请参阅安装说明Extras

    以下命令将更新您的 .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\""
    

    然后我可以通过选择 Sourcetree 中的菜单选项来使用 DiffMerge

    可选)您可能希望在其他参数之前将--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\""
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。当我点击 External Diff 时,DiffMerge 也没有启动。

      问题似乎是 .gitconfig 文件中 DiffMerge 的路径: cmd = /Applications/DiffMerge.app/Contents/MacOS/DiffMerge/Contents/MacOS/DiffMerge ....

      如果你检查路径/Applications/DiffMerge.app/Contents/MacOS/DiffMerge,它实际上不是一个目录而是一个文件。似乎 SourceTree 在路径上添加了两次 /Contents/MacOS/DiffMerge。我删除了重复的部分,External Diff 开始工作了。

      没试过合并。

      【讨论】:

      • 如果我这样做并重新启动 SourceTree,它会重新/恢复重复的部分。如何永久删除它_
      • @esbenr 定义自定义差异工具,如 Saren Inden 的解决方案中所述。只需将 diffMerge 的正确 cmd 和参数复制到 sourcetree 设置即可。
      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2017-04-28
      • 2020-03-07
      • 2023-01-10
      • 1970-01-01
      • 2012-12-01
      • 2019-05-26
      相关资源
      最近更新 更多