Bash git别名选项卡完成错误

时间:2011-09-02 02:47:58

标签: git bash shell alias msysgit

我知道Git别名可以与参数Git Faq section "Git Aliases with argument"一起使用。

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

采用简单示例 不适合实际使用。如果我这样做一个别名:

[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_ {周围的引号标记似乎很奇怪。

BTW,我的msysgit版本是1.7.6-preview20110708

添加

其他奇怪的事情是,我搜索了Git目录下的所有文件,发现没有文件包含字符串 _git _ {

3 个答案:

答案 0 :(得分:2)

我猜是为git设置了自定义完成功能,错误在于该设置。首先尝试删除自定义完成,然后查看错误是否消失:

complete -r git

旁注:对于在git别名中具有可重用参数的shell命令,现代习惯用法是定义一个shell函数,它允许您使用标准shell参数处理,并且与''相比,只需要一个较少级别的参数引用来处理sh -c':

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

答案 1 :(得分:2)

我遇到了完全相同的问题。例如,我有一个别名,用于一次性删除本地分支及其远程对应分区:

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

为了解决这个问题,我删除了别名,并将一个名为 git-db 的文件添加到我的Git脚本目录中。它可以是 PATH 中的任何目录。这是文件的内容。

#!/bin/sh

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

请注意,该文件不得包含扩展名。它可以像别名一样使用:

git db mybranch

答案 2 :(得分:2)

此错误是由旧版本的Git附带的bash完成脚本中的缺点造成的。它不是为处理shell别名而设计的,这导致了这个错误。这已在commit 56f24e80f0中修复,但直到Git 2.1.0才包含此更改。但是,msysGit仍然是在Git 1.9.5上写的,因此不包括修复。

首选解决方案是切换到跟踪当前Git版本的msysGit的后续版本Git for Windows

但是,如果您遇到旧版本的Git,您仍然可以通过使用自定义脚本替换别名来解决此问题,如the answer by @Reinhard Nägele中所述。