Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`git difftool`和名称文件中的WiteSpace_Git_Path_Whitespace - Fatal编程技术网

`git difftool`和名称文件中的WiteSpace

`git difftool`和名称文件中的WiteSpace,git,path,whitespace,Git,Path,Whitespace,似乎在执行外部命令时,git difftool没有正确引用参数 如果.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 如您所见,文件名没有

似乎在执行外部命令时,
git difftool
没有正确引用参数

如果
.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
如您所见,文件名没有被引用(尽管命令中有显式的引号),因此参数解析失败。删除
.gitconfig
(编辑:并将其转义为
\”
)中的引号不会更改结果

(通过使用任何diff程序替换
echo
,您可以得到一个更有意义的用例)

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

这应该可以:

[difftool.echo]
    cmd = 'echo "$LOCAL" "$REMOTE"'
将整个命令用单引号括起来会导致Git将其视为单个字符串,该字符串未经修改就被分配给
diftool.echo
命令。这就是我们想要的

这与一个非常相似,但不起作用:

# This won't work
cmd = "echo '$LOCAL' '$REMOTE'"
这不起作用的原因与Bash(以及大多数shell)中处理引号的方式有关。这会将
echo'$LOCAL'$REMOTE'
指定为命令,但单引号不会展开变量。这就是为什么您会得到
$LOCAL$REMOTE
的文本输出


本文顶部工作版本中的内部双引号将允许展开其中的参数。

您需要在
.gitconfig
中的命令周围转义引号:

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

我想你必须避开引号:
cmd=echo\“$LOCAL\”\“$REMOTE\”
我也试过了,但还是没有改变。那么
cmd=“echo\”$LOCAL\“\”\“$REMOTE\”
cmd=“echo'$LOCAL'$REMOTE'
第一个引号仍然没有改变(引号);第二个至少给出了一个更改:它输出文本字符串
$LOCAL$REMOTE
。但这不是我们想要的…更正:由于某些原因,当我使用您的第一个版本
cmd=echo\“$LOCAL\\”$REMOTE时,我并不完全清楚\“
使用
echo
作为命令,就像我在以前的测试中所做的那样,它给出了未被替换的文件名,但随后将
echo
替换为diff工具的命令名(
latexdiff
,在我的例子中)起作用,因为它在正确的文件上运行,而不是在空格上阻塞。我怀疑这里有一些神奇的东西在使用包含空格的参数。因此,我已经为我的现实问题找到了一个有效的解决方案。谢谢还是不行。无法使用
/usr/lib/git core/git difftool--helper:1:eval:echo$LOCAL$REMOTE:not found
。我猜它会以这种方式查找名为“echo$LOCAL$REMOTE”的可执行文件。再次感谢!如注释中所述,这适用于我的用例,尽管带有
echo
的版本仍然不会在文件名周围打印引号。