2013-05-11 63 views
37

我刚开始使用Git。我想使用TortoiseMerge作为difftool和mergetool。可以将TortoiseMerge与Windows Git Bash一起用作difftool吗?

在我个人用户目录中的.gtconfig中,我有以下部分。我已经删除了这个问题的用户和颜色部分。

[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一起安装。

回答

57

以下设置适用于我。但是,我正在使用TortoiseGit而不是TortoiseSVN。注意差异参数的差异。

[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" 
+2

TortoiseMerge对Git破坏参数的方式有一个问题。由于TortoiseMerge使用冒号来分隔参数名称和值,因此Git在用空格处理文件名时会加上引号。 TortoiseGitMerge允许空间并解决问题。 – 2013-05-11 10:14:22

+0

这是msys bash,损坏报价。显然它应该与龟git 1.8 – jwg 2013-09-12 14:10:43

+0

[Perforce无法应付冒号](http://stackoverflow.com/a/12638596/284795)。我们应该要求TortoiseMerge添加一个替代语法。 – 2014-08-15 09:13:26

6

因此,与空格的文件名正确处理,你应该@墨尔本的回答的最后一行改为

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

有什么区别? (仅)参数中的冒号是否已被空格替换?是否应该对difftool进行类似的更改?我不知道是否值得编辑原始答案,或者是否有冒号的原因。 – mwfearnley 2014-08-27 22:33:06

+0

冒号被空格替换。参数处理代码可以接受冒号或空格。但是,如果引号不在“单词”的开始或结尾处,则引号围绕其中包含空格的文件名将无法正确处理。 – jwg 2014-08-31 07:05:27

+2

@jwg我现在修改了我的答案,将您的建议考虑在内。谢谢! – 2015-03-26 08:19:25

0

伟大的答案!为我节省了很多时间。 一个缺点是,在difftool命令执行过程中,不会从存储库新增或删除文件。以下是我在此之上所做的: (受我的同事answer的启发)。

  1. $Home目录(C:/ home)中创建一个名为empty.empty的文件。顾名思义,保持空白。与以下内容

:(/家/箱C):

  • 创建$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 
    
  • 修改您的.gitconfig文件(答案的第11行)

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

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

  • 请记住:你必须运行之后git difftool --staged而不是简单地git difftoolgit add .
  • 相关问题