如何将'git'别名为'g',以便保留bash完成规则?


25

如果我这样做:

alias g='git'

我松开了所有的完成规则(例如,键入时按下TAB时,分支和远程将不再自动完成g push o)。


虽然我没有答案,但是我将不得不花一分钟时间,想知道是否不键入其他两个字母确实会给您带来很多好处?
马可Ceppi

4
当然可以!我每天可能要输入100次以上的“ g”。
帕维尔Gościcki

3
将常用的短命令别名为更短的别名,每天可以为我节省数百次按键操作。根据我的shell历史记录,g=git过去一个月我使用了756次别名,这意味着我总共按了1512次“ g”和“ i”键。结合我的git别名,可能每月可以为我节省成千上万的按键操作。

缩短按键的主要目的是帮助您的手跟上您的大脑。
泰勒·科利尔

superuser.com/questions/436314/…上的脚本效果很好,我认为值得一提。
brandizzi

Answers:


21

从中进行适当的复制和修改/etc/bash_completion.d/git,将以下行添加到您的~/.bashrc

complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
    || complete -o default -o nospace -F _git g

哈!Wunderbar!工作就像它应该:)
帕维尔Gościcki

1
我还必须添加source /usr/share/bash-completion/completions/git到.bashrc
pcx 2014年

不知道.bashrc这里的代码是否有效,但是这个答案肯定已经过时了。/etc/bash_completion.d/git在14.04上似乎不存在。请参阅下面的lzap答案
Max Wallace 2015年

18

最新的bash补全上游稍微移动了一点,并将其重命名。下雪了:

source /usr/share/bash-completion/completions/git
__git_complete g __git_main

遇到以下情况时,请在最新版本的Ubuntu(例如14.04,还有Fedora 22+)中使用此功能:

completion: function `_git' not found

在完成过程中。


2
似乎这是这里唯一正确的答案。
pjvandehaar,2015年

使用__git_complete gc _git_checkout(或类似方法)为更具体的别名设置补全。/usr/.../git如上搜索以找到正确的名称。
Max Wallace 2015年

1
@MaxWallace-在.gitconfig中为特定的git方法设置别名(例如gc = checkout)时,无需显式配置它们的完成。
Piotr Aleksander Chmielowski

1
@PiotrAleksanderChmielowski谢谢!但是我认为这不适用于顶级bash别名(例如gc=> git checkout),而不是别名ccheckoutinside git和said git c。如果我错了纠正我。
Max Wallace

@MaxWallace是的,您是对的,我的错;)
Piotr Aleksander Chmielowski


2

首先,查找原始的完成命令。例:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

现在将它们添加到您的启动脚本中(例如〜/ .bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

_completion_loader行可能不是必需的。但是在某些情况下,仅在键入命令并TAB第一次按下后才动态加载完成功能。因此,如果您未使用原始命令,并尝试使用别名+ TAB,则可能会收到类似“ bash:completion:函数未找到”的错误。


效果很好。对我来说,这是正确的答案,完成时使用grep命令非常方便。不需要完成加载程序。
Paul Carlton

1

更新的方式做到这一点(完全不会为我工作):

  1. cd -切换到您的主目录
  2. wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
  3. 添加source ~/git-completion.bash到您的.bashrc文件中(如果您没有此文件,请在主文件夹中创建一个文件,bash会自动查找它)
  4. 添加alias g='git'到您的.bashrc文件。
  5. 开始新的会话或通过以下方式获取更改 source ~/.bashrc

2
您在链接到的评论中跳过了他们实际添加完成的部分:__git_complete g _git
pjvandehaar 2015年

0

为了完整起见,我想使用~/.bash-completion文件添加一个答案,该文件来源于bash-completion脚本的末尾:

_xfunc git __git_complete g __git_main
_xfunc git __git_complete gl _git_log
_xfunc git __git_complete gd _git_diff
_xfunc git __git_complete gb _git_branch

然后在我~/.bashrc我只有别名。我试图:

  • 避免~/.bashrc用bash 补全的东西污染我(保持它所属的地方)✓
  • 避免将整个git-completion采购到我的shell中

不幸的_xfunc是,无论如何,源代码都是git-completion。一旦弄清楚如何正确执行此操作,我将更新此答案(我也在此处的便当纸上询问)。


-1

在这里看:https : //gist.github.com/scue/576310b7c6b7714aad05

wget https://gist.github.com/scue/576310b7c6b7714aad05/raw/459d46761c231f5c373c1cf496920b01bb6669d2/.bash_aliases.git -O ~/.bash_aliases.git
echo "test -e ~/.bash_aliases.git && source ~/.bash_aliases.git" >> ~/.bashrc

享受!(^ o ^)/


1
抱歉,那是完全不同的东西。为整个命令制作这样简单的别名es是微不足道的。
帕维尔Gościcki

我只是让它们像Oh-My-Zsh的git插件一样工作:github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/…–
提示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.