Bash git别名选项卡自动补全错误

13

我知道Git别名可以与参数一起使用,请参考Git常见问题解答中的“带参数的Git别名”部分

但是今天我遇到了一个错误。

举个简单的例子,并非适用于实际情况。如果我创建一个像这样的别名:

[alias]
    lo = "!sh -c 'git log $1' -"

那么我可以使用

git lo file_a

查看file_a的日志。

但是当我使用“tab”自动完成路径时,出现了以下错误。

git lo [tab]

错误信息:

sh: declare: `_git_{': not a valid identifier

看起来是git-completion.bash中的一个错误,但我找不到`_git_{'在哪里!

另外,我发现在错误信息中,围绕_git_{的引号标记似乎很奇怪。

顺便说一下,我的msysgit版本是1.7.6-preview20110708。

补充:

另一个奇怪的事情是,我在Git目录下搜索了所有文件,发现没有文件包含字符串_git_{


你的意思是这是bash错误?和Git无关吗? - HaveF
据我所知,Debian使用dash而不是bash... - kusma
_git_{ 将出现在一个脚本扩展中,该扩展在您键入的 git 命令的 __{ 两侧添加了这些字符。虽然这并没有太大帮助... - Philip Oakley
1
@kusma 我不知道Debian的默认shell是什么,但我使用的是bash - HaveF
@Philip,谢谢你的提示。顺便问一下,你知道这个奇怪的引号是从哪里来的吗? - HaveF
显示剩余4条评论
3个回答

3

我有过完全相同的问题。例如,我为删除本地分支及其远程对应分支设置了一个别名:

[alias]
db = "!f() { git branch -d $1 && git push origin :$1; }; f"

为了解决这个问题,我移除了别名并在我的Git脚本目录中添加了一个名为git-db的文件。它可以是PATH中的任何目录。下面是该文件的内容。
#!/bin/sh

git branch -d $1 && git push origin :$1

请注意,该文件不能有扩展名。它可以像别名一样使用:
git db mybranch

2
我猜测git设置了自定义的完成功能,错误就出在这个设置里。首先尝试删除自定义完成功能,看看错误是否消失:
complete -r git

备注:对于在git别名中具有可重用参数的shell命令,现代惯用语是定义一个shell函数,这使您可以使用标准的shell参数处理方式,并且与“sh -c”相比,少了一个层次的参数引用问题:

[alias]
  plush = "!f() { git pull \"$@\" && git push \"$@\" }; f"

谢谢您的回复。是的,有一个自定义完成函数文件用于git,但它与Debian上的Git 1.7.4文件相同,因此我仍然认为这个错误是由mysysgit附带的bash引起的。我还将这个问题发送到了mysysgit的邮件列表,但没有得到答案。所以,就让它过去吧...顺便说一句,感谢您的“旁注”! - HaveF
备忘录:msysgit 邮件列表上的信息:http://groups.google.com/group/msysgit/browse_thread/thread/37e89bcac954f5ec/f09a450a140021dc。目前还没有答案。 - VonC

2
这个错误是由于旧版本的Git附带的bash自动补全脚本存在缺陷导致的。它无法处理shell别名,从而引起了此错误。这在提交 56f24e80f0中得到了修复,但是直到Git 2.1.0才包含了此更改。然而,截至本文撰写时,msysGit仍在使用Git 1.9.5,因此没有包含此修复。
首选解决方案是切换到Git for Windows,这是msysGit的继任者,跟踪当前的Git发布版本。
但是,如果您被困在旧版本的Git中,仍然可以通过将别名替换为自定义脚本来解决问题,如@Reinhard Nägele的答案所述

注意:截至本文撰写时,Git For Windows 版本为 2.4.2(即将更新至 2.4.3):https://github.com/git-for-windows/git/releases。Msysgit 已经被淘汰(https://dev59.com/_nRA5IYBdhLWcg3w6STZ#784743),现在使用 msys2 64 位版本(https://dev59.com/3GMm5IYBdhLWcg3wKsrO#17810334),并且结果是 http://git-for-windows.github.io/,而不是旧的、现在已经过时的 http://msysgit.github.io/。 - VonC
看起来事情还在适应转换。git-scm.com仍然链接到msysGit的1.9.5版本,而不是最新的Git for Windows版本。我会相应地更新我的答案。 - Daniel Harding
我同意。虽然这个转换还没有正式进行,但是我已经使用Git for Windows 2.x超过一个月了,没有遇到任何问题。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接