【问题标题】:Can TortoiseMerge be used as a difftool with Windows Git Bash?TortoiseMerge 可以用作 Windows Git Bash 的 difftool 吗?
【发布时间】:2013-05-05 19:03:05
【问题描述】:

我刚刚开始使用 Git。我想使用 TortoiseMerge 作为 difftool 和 mergetool。

在我的$HOME/.gitconfig 中,我有以下部分。我已删除此问题的用户和颜色部分。

[merge]
    tool = tortoisemerge
[mergetool "tortoisemerge"]
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
[diff]
    tool = tortoisemerge
[difftool "tortoisemerge"]
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"

如果我在 Git Bash 提示符下键入 tortoisemerge,它会加载。众所周知,它在路上。但是如果我输入命令,我会收到以下错误。

Rich:mygittest (master *)
$ git difftool
error: 'tortoisemerge' can only be used to resolve merges
merge tool candidates: kompare emerge vimdiff
No known merge resolution program available.
external diff died, stopping at readme.txt.
Rich:mygittest (master *)
$ 

我有什么不明白的地方? Tortoisemerge 与 TortoiseSVN 一起安装。

【问题讨论】:

    标签: git tortoisegit git-diff tortoisegitmerge


    【解决方案1】:

    这是一种更简单的方法,只需在 git bash 中运行这些命令即可:

    git config --global merge.tool tortoisemerge
    git config --global diff.tool tortoisediff
    git config --global difftool.tortoisediff.cmd "TortoiseGitMerge \$LOCAL \$REMOTE"
    

    完成了。

    您可能还需要其他设置:

    # you may want to disable prompt or merge backup
    git config --global mergetool.keepBackup false
    git config --global difftool.prompt false
    git config --global mergetool.prompt false
    
    # set the path only when it's not found in system path
    git config --global mergetool.tortoisemerge.path "C:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe" 
    git config --global difftool.tortoisdiff.path "C:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe"
    

    ----供进一步阅读----

    Windows 安装程序的 Git 包含一个 shell 文件,用于运行 tortoisegitmerge 作为合并工具。它位于C:\Program Files\Git\mingw64\libexec\git-core\mergetools
    因此,要设置合并工具,您只需要合并工具名称。 您可以使用以下命令检查您机器上支持的所有合并/差异工具:

    git difftool --tool-help
    git mergetool --tool-help
    

    运行 tortoisegitmerge as git diff 工具不受 git 官方支持,可能是因为该工具不支持目录比较 (git difftool -d)。所以需要设置命令作为git difftool使用。

    Git 为你提供了 4 个变量:$BASE $LOCAL $REMOTE $MERGED,你可以在上面提到的 tortoisegitmerge shell 文件中查看。

    tortoisegitmerge 工具的手册位于:
    https://tortoisegit.org/docs/tortoisegitmerge/tme-automation.html
    您可以找到区分文件的最简单方法是:
    TortoiseGitMerge BaseFilePath MyFilePath [ TheirFilePath ] 用于 difftool.tortoisediff.cmd

    【讨论】:

      【解决方案2】:

      在 Windows 中将 TortoiseMerge 与现有的 TortoiseSVN 安装一起使用:

      [guitool "VisualDiff"]
          cmd = git difftool -y \"$FILENAME\"
          needsfile = yes
          noconsole = yes
      [diff]
          tool = tortoisediff
      [difftool]
          prompt = false
      [merge]
          tool = tortoisemerge
      [mergetool]
          prompt = false
          keepBackup = false
      [difftool "tortoisediff"]
          cmd = \""W:/Programs/TortoiseSVN/bin/TortoiseMerge.exe"\" "/mine:$REMOTE" "/base:$LOCAL"
      [mergetool "tortoisemerge"]
          cmd = \""W:/Programs/TortoiseSVN/bin/TortoiseMerge.exe"\" "/base:$BASE" "/theirs:$REMOTE" "/mine:$LOCAL" "/merged:$MERGED"
      

      【讨论】:

        【解决方案3】:

        rebase 时,我强烈建议切换 $theirs$mine,因为合并和 rebase-merge 时是不同的。在这里检查:

        What is the precise meaning of "ours" and "theirs" in git?

        所以,如果你像我一样只使用 mergetool 来变基,那么:

        [mergetool "tortoisemerge"]
        cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$LOCAL" -mine "$REMOTE" -merged "$MERGED"
        

        【讨论】:

          【解决方案4】:
          [diff]
            tool = tortoisediff
          [difftool]
            prompt = false
          [merge]
            tool = tortoisemerge
          [mergetool]
            prompt = false
            keepBackup = false
          [difftool "tortoisediff"]
            cmd = \""C:/Users/$USER/Desktop/TortoiseMerge.exe"\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
          [mergetool "tortoisemerge"]
            cmd = \""C:/Users/$USER/Desktop/TortoiseMerge.exe"\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
          

          这对我有用,使用 TortoiseMerge 1.6.7(便携式)

          【讨论】:

            【解决方案5】:

            Klas Mellbourn 的回答很好!节省了我很多时间。 一个缺点是,在 difftool 命令执行期间,存储库中的新 AddedRemoved 文件不会显示出来。没有什么可以和他们相比的!这是我在此之上所做的: (灵感来自我同事的answer)。

            1. $Home 目录中创建一个名为empty.empty 的文件(在您的bash 中执行start ~)。顾名思义,请保持空白。
            2. $Home/bin目录中创建另一个名为tortoisediff.sh的文件,内容如下

            #!/bin/sh
            # $LOCAL $REMOTE seem to be swapped
            # $1 is $LOCAL
            # $2 is $REMOTE
            
            difftool='/c/Program Files/TortoiseGit/bin/TortoiseGitMerge.exe'
            NULL="/dev/null"
            empty="C:/home/empty.empty"
            
            if [ "$1" == "$NULL" ]; then
                echo "Added: " "$2"
                "$difftool" /base:"$empty" /mine:"$2" /readonly:"$empty"
            elif [ "$2" == "$NULL" ]; then
                echo 'Removed: ' "$1"
                "$difftool" /base:"$1" /readonly:"$1" /mine:"$empty"
            else
                echo 'Modified' "$2"
                "$difftool" /base:"$1" /basename:"$1" /readonly:"$1" /mine:"$2" /minename:"$2"
            fi
            
            # Checkout https://tortoisegit.org/docs/tortoisegitmerge/tme-automation.html for more
            
            1. 修改你的 .gitconfig 文件(答案的第 11 行)

              cmd = tortoisediff.sh "$LOCAL" "$REMOTE"

            这将使 difftool 引用 tortoisediff.sh 而不是直接打开应用程序。

            1. 请记住:您必须先运行 git add .,然后运行 ​​git difftool --staged,而不是简单地运行 git difftool

            【讨论】:

              【解决方案6】:

              以下设置对我来说很好用。但是,我使用的是 TortoiseGit 而不是 TortoiseSVN。注意diff参数的不同。

              [diff]
                tool = tortoisediff
              [difftool]
                prompt = false
              [merge]
                tool = tortoisemerge
              [mergetool]
                prompt = false
                keepBackup = false
              [difftool "tortoisediff"]
                cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -mine "$REMOTE" -base "$LOCAL"
              [mergetool "tortoisemerge"]
                cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED"
              

              【讨论】:

              • TortoiseMerge 在 Git 破坏参数的方式上存在问题。因为 TortoiseMerge 使用冒号来分隔参数名称和值,所以 Git 在处理带有空格的文件名时会在两者之间加上引号。 TortoiseGitMerge 允许一个空间并缓解问题。
              • 是 msys bash 破坏了引号。显然它应该适用于乌龟 git 1.8
              • Perforce can't cope with colons either。我们应该要求 TortoiseMerge 添加替代语法。
              • 当有TortoiseSVNTortoiseMerge.exe 时,它适用于我。是的,diffTortoiseMerge.exe,而不是 TortoiseIDiff.exegit difftool呼出TortoiseMerge GUI,很方便! TortoiseMerge 是最好的!
              【解决方案7】:

              为了正确处理带有空格的文件名,您应该将@melbourn 答案的最后一行更改为

              cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED"
              

              【讨论】:

              • 有什么区别?是否(只是)参数中的冒号已被空格替换?是否应该对 difftool 进行类似的更改?我不知道是否值得编辑原始答案,或者冒号是否有某种原因..
              • 冒号替换为空格。参数处理代码可以接受冒号或空格。但是,如果引号不在“单词”的开头或结尾,则不会正确处理包含空格的文件名周围的引号。
              • @jwg 我现在修改了我的答案以考虑您的建议。谢谢!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-08-19
              • 1970-01-01
              • 2017-01-15
              • 1970-01-01
              • 2018-06-24
              • 2016-08-18
              • 1970-01-01
              相关资源
              最近更新 更多