2014-01-13 62 views
6

看来,当git difftool执行外部命令时,它不会正确引用参数。`git difftool`和witespaces在名称文件中

如果.gitconfig包含以下行:

[difftool.echo] 
    cmd = echo "$LOCAL" "$REMOTE" 

当我尝试用包含空格的路径运行difftool,如

> git difftool -t echo HEAD^ HEAD spaces\ here/test.txt 

我得到以下结果:

/tmp/RL2Nyi_test.txt spaces here/test.txt 

正如你所看到的,文件名不被引用(尽管ex在命令中使用plicit引号),因此参数解析失败。删除.gitconfig(编辑:以及将它们转义为\")中的引号不会改变结果。

(用任何diff程序代替echo,你会得到更有意义的用例)。

如何获得正确转义的文件名?

+0

我认为你必须逃脱引号:'CMD =回声\ “$ LOCAL \” \ “$ REMOTE \”' – CharlesB

+0

我也尝试过,仍然没有改变。 –

+0

'cmd =“echo”$ LOCAL \“\”$ REMOTE \“”'',cmd =“echo'$ LOCAL''$ REMOTE'”''? – CharlesB

回答

5

你会想在.gitconfig逃避周围的命令报价:

cmd = difftoolname \"$LOCAL\" \"$REMOTE\" 
+0

再次感谢!正如评论中指出的那样,这适用于我的用例,尽管带'echo'的版本仍然不会在文件名周围打印引号。 –

1

这应该工作:

[difftool.echo] 
    cmd = 'echo "$LOCAL" "$REMOTE"' 

用单引号环绕整个命令导致的Git把它作为一个单一的字符串,它被分配到diftool.echo命令修改。这是我们想要的。

这是非常相似的一个suggested in the comments above,没有工作:

# This won't work 
cmd = "echo '$LOCAL' '$REMOTE'" 

,这不工作的原因有引号中的Bash(最炮弹一般的处理方式做)。这个命令分配echo '$LOCAL' '$REMOTE'作为命令,但单引号将不是展开变量。这就是为什么你得到了$LOCAL $REMOTE的文字输出。

在这篇文章顶部的工作版本中的内部双引号将允许它们内部的参数被扩展。

+0

仍然无法使用。 '/ usr/lib/git-core/git-difftool - helper:1:eval:echo $ LOCAL $ REMOTE:not found'失败。我想通过这种方式,它寻找一个名为'echo $ LOCAL $ REMOTE'的可执行文件 –