【问题标题】:Bash git alias tab completion errorBash git别名选项卡完成错误
【发布时间】:2011-11-08 21:04:27
【问题描述】:

我知道 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_{ 周围的引号似乎很奇怪。

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

添加:

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

【问题讨论】:

  • 我只在 got bash 命令中看到完成错误,而不是在完成工作良好的 git cmd 会话中。
  • 你的意思是这是一个 bash 错误?与 Git 无关?
  • 是的,也许你是对的。我在 Debian 上的 Git 1.7.4 中测试了这个别名,似乎没问题。也许这个错误是由 msysgit 附带的 bash 引起的。我会将它报告给 msysgit 社区。谢谢,VonC!
  • AFAIK Debian 使用 dash 而不是 bash...
  • @kusma 我不知道 Debian 的默认 shell 是什么,但我使用 bash

标签: git bash shell alias msysgit


【解决方案1】:

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

首选的解决方案是切换到 Git for Windows,它是 msysGit 的继任者,它跟踪当前的 Git 版本。

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

【讨论】:

【解决方案2】:

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

[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

【讨论】:

    【解决方案3】:

    我猜有一个为 git 设置的自定义完成功能,错误就在那个设置中。先试试去掉自定义补全,看看错误是否消失:

    complete -r git
    

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

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

    【讨论】:

    • 感谢您的回复。是的,有一个 git 的自定义完成函数文件,但它与 Debian 上的 Git 1.7.4 的文件相同,所以我仍然认为这个 bug 是由 mysysgit 附带的 bash 引入的。我也将这个问题发送到 mysysgit 的邮件列表,但没有得到答复。所以,算了吧……顺便说一句,谢谢你的“旁注”!
    • 自我注意:msysgit 邮件列表消息:groups.google.com/group/msysgit/browse_thread/thread/…。还没有答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2013-07-02
    • 1970-01-01
    • 2012-04-09
    • 2015-01-18
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多