gpt4 book ai didi

linux - Git 别名 - 分支名称的命令行自动补全

转载 作者:IT老高 更新时间:2023-10-28 12:40:17 26 4
gpt4 key购买 nike

如果我运行诸如 git checkout 之类的常规 git 命令,我会在按 Tab 键时获得有用的分支名称自动补全。

我有一些 git 别名,它们将分支名称作为参数,我想知道是否有办法让分支名称自动完成以与它们一起使用?

编辑:

只是为了在评论中的讨论中提供一些澄清,具有直接映射的别名可以正常工作,即:

ci = commit
co = checkout

涉及的比较多,使用 $1 作为参数而不是,例如:

tagarchive = !f() { git tag archive/$1 origin/$1 && git push origin :$1 && git push origin archive/$1 && git branch -d $1; }; f

最佳答案

对于 git 别名,git 命令 (__git()) 的自动完成功能使用对 git config --get "alias.$1" 的调用来确定等效的自动完成功能。这适用于简单的映射,但会阻塞更复杂的别名。

要解决这个问题,请定义一个名称与您的别名匹配的自动完成函数,即 _git_tagarchive()。 git 的自动完成功能应该选择它并将其用于自动完成。

例如:

[me@home]$ git tagarchive <TAB><TAB>
AUTHORS gentleSelect/ .gitignore LICENSE test_multiple.html
cron/ .git/ index.html README.md
[me@home]$ _git_tagarchive() {
> _git_branch # reuse that of git branch
> }
[me@home]$ git tagarchive <TAB><TAB>
enable_multiple master origin/gh-pages v0.1 v0.1.3
FETCH_HEAD ORIG_HEAD origin/HEAD v0.1.1 v0.1.3.1
HEAD origin/enable_multiple origin/master v0.1.2

要获得更持久的解决方案,只需将函数定义添加到您的 bashrc 文件中。例如:

_git_tagarchive() 
{
_git_branch
}

请注意,我只是重用了 git branch 的自动完成功能;您可能希望将其更改为更合适的内容或编写您自己的内容。

更多信息

此解决方案是根据对 /etc/bash_completion.d/git 的探索确定的。

通常,别名 git 命令由 __git_aliased_commands() 函数处理,该函数解析 git config --get "alias.$1" 的输出以决定自动完成要使用的功能。可以理解,使用更复杂的 shell 命令作为别名目标会挫败这种方法。

进一步看,git (_git()) 链的自动完成功能出现在子命令的自动完成功能中,方法是简单地在函数前面加上 _git_(带有破折号(-) 在命令中替换为下划线)。这是在检查 __git_aliased_command() 之前完成的,所以这是我们可以使用的。

_git ()
{
# .....
local completion_func="_git_${command//-/_}"
declare -f $completion_func >/dev/null && $completion_func && return

local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi

}

因此,我采用的方法是确保存在与您的别名匹配的函数,即 _git_tagarchive()

关于linux - Git 别名 - 分支名称的命令行自动补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com