我知道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 _ {
答案 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中所述。