自定义 git 命令自动补全

9
我通过编写一个位于/usr/local/bin的shell脚本实现了自定义git命令。它正常工作,但我想让脚本在命令行中自动完成分支,就像git checkout [TAB][TAB]一样。该怎么做?
编辑: 只是添加一些背景信息:git允许您通过创建一个名为git-$subcommandName的脚本非常容易地添加自己的命令。在我的情况下,这里是git-install,脚本方便检出一个分支,构建、打包和安装源代码。

2
这里并不是要重新发明轮子,我的自定义命令"git install"接受一个分支名称,然后检出该分支(所以是和git checkout一样的),但接下来会进行一系列步骤,将源代码打包并安装到计算机集群上。 - primitivist
1
@pedrorijo91 别名只允许您重用预先存在的 git 命令,这对我来说行不通。我认为我的问题不太清楚,所以我刚刚添加了一个编辑。 - primitivist
4
我提名重新开放这个问题 - 这是一个非常具体的需求,具有广泛适用性的完美简洁的问题。 - Ken Williams
1
git别名可以用于其他事情,您可以拥有一个别名,例如!sh do_foo - thecoshman
4
@KenWilliams,很高兴你这么做了。我认为那些投票关闭的人应该重新审视这个问题。 :( 即使是未经编辑的问题也没有要求重新实现所有git的bash自动补全功能。(那太疯狂了!) 很明显,它的范围仅限于用户添加的自定义命令。原帖作者甚至给出了一个非常简短的完美解答,并为其他人实现他们自己的自定义命令提供了一个起点。 - user1902689
显示剩余2条评论
1个回答

12

我明白了。我需要下载 git bash completion (这里),在 /etc/bash_completion.d 中创建一个新文件,并将以下内容添加进去:

source ~/.git-completion.bash
_git_install ()
{
  __gitcomp_nl "$(__git_refs)"
}

然后输入exec bash重新加载完成脚本。


4
请注意,如果您的自定义Git命令中有横杠(即log-diff),则您创建的Bash函数必须将横杠替换为下划线(即_git_log_diff())。 - user1902689
2
我还要补充一点,如果只是想复制另一个命令的完整完成方式,那么 Bash 函数的主体可以直接调用另一个函数。虽然这不是你想要的,但如果你确实需要,Bash 函数的主体可以直接是 _git_checkout "$@"。如果你正在创建一个自定义命令,比如 log-diff,并希望它的完成方式与 log 完全相同,这将非常有用。 - user1902689
1
不需要传递参数,只需 _git_install() { _git_checkout ; } - FelipeC
答案没有提到/etc/bash_completion.d/中文件的名称需要是什么。通过一些实验,看起来这并不重要,您可以将多个函数放在同一个文件中,因此您只需将其命名为git-commands,然后在顶部有一个源行,然后是每个git函数的一堆bash函数。 - Nickolai
然而,在某些系统(例如Ubuntu 20.04)中,已经存在一个最新的文件,例如/usr/share/bash-completion/completions/git。因此,您可以使用该文件,而无需下载一个新的。 - Stavros

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