【问题标题】:Custom git command autocompletion自定义 git 命令自动补全
【发布时间】:2017-05-09 12:08:24
【问题描述】:

我通过编写位于/usr/local/bin 的shell 脚本实现了一个自定义git 命令。它工作正常,但我希望脚本在命令行中自动完成分支,就像git checkout [TAB][TAB] 一样。这怎么可能?

编辑: 只需添加一些上下文:git 允许您非常轻松地通过创建脚本 git-$subcommandName 添加自己的命令。在我这里git-install 的例子中,该脚本有助于签出分支、构建、打包和安装源代码。

【问题讨论】:

  • 这里并没有真正重新发明轮子,我的自定义命令“git install”采用了一个分支名称,它会签出(所以是的,与 git checkout 相同),但它随后会执行一系列步骤来将源打包并安装到计算集群上。
  • @pedrorijo91 别名仅允许您重用预先存在的 git 命令,这对我不起作用。我不认为我的问题很清楚,所以我只是添加了一个编辑。
  • 我提名这个问题重新开放 - 这是一个关于非常具体的需求的非常简洁的问题,具有广泛的适用性。
  • git 别名可以用于其他事情,你可以有一个别名如!sh do_foo
  • @KenWilliams,很高兴你做到了。我认为那些投票结束的人应该重新审视这个问题。 :-( 即使是未经编辑的问题也没有要求重新实现 git 的所有 bash 自动完成功能。(那太疯狂了!)很明显,它的范围仅限于用户添加的自定义命令。原始海报甚至给出了一个非常简短的答案,完美运行,并为其他人实现自己的自定义命令提供了一个起点。

标签: linux git shell


【解决方案1】:

想通了。我需要下载git bash完成(here),在/etc/bash_completion.d创建一个新文件,内容如下:

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

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

【讨论】:

  • 请注意,如果您的自定义 git 命令中有一个破折号(即log-diff),那么您创建的 bash 函数必须用下划线替换破折号(即_git_log_diff()。)
  • 我还要补充一点,以简单地将精确完成复制为另一个命令,bash 函数的主体可以调用另一个。这不是你想要的,但如果你这样做了,bash 函数的主体可能只是_git_checkout "$@"。如果您正在制作像 log-diff 这样的自定义命令并希望它以与 log 相同的方式完成,这很有用。
  • 不需要传递参数,只需_git_install() { _git_checkout ; }
  • 答案没有提到/etc/bash_completion.d/ 中的文件名需要是什么。从一些实验来看,这似乎无关紧要,您可以将多个函数放在同一个文件中,因此您可以将其命名为 git-commands 并在顶部放置一个源代码行,然后为每个函数添加一堆 bash 函数你的 git 函数。
猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多