git在命令行自动完成*分支*?


350

在我的Linux机器上,我具有Git 分支的自动完成功能

[请注意,我们谈论的是git分支的完成,而不是 bash的完成(例如命令,文件等)。因此,完全不是莱恩的答案 ]

例如,我可以输入git checkout+ TAB并获取分支列表。

或者,我可以键入git checkout feb*+ TAB以获取所有以“ feb”开头的分支。

如何在Mac上获得此功能?

我尝试下载并运行bash-completion/bash_completionbash-completion/bash_completion.sh.in但没有任何乐趣。第一个给出有关的错误消息declare: -A invalid_option。第二个没有错误。当我git checkout+时,TAB我仍然在目录中获得文件列表,而不是分支。我在项目根目录中。

自动完成目录和bash命令的工作正常,因此它特定于Git。

Answers:


482

好的,所以我需要git autocompletion脚本。

我从这个网址得到的:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

在运行该目录时,无需担心您所在的目录~,因为目标目录使用了主目录()。

然后,~/.bash_profile将以下“如果存在则执行”代码添加到我的文件中:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

更新:我使这些代码更简洁以缩小.bashrc文件,在这种情况下,我现在使用:

test -f ~/.git-completion.bash && . $_

注意:$_表示上一个命令的最后一个参数。因此. $_意味着要运行它- .git-completion.bash在这种情况下为“ it”

这在Ubuntu和OSX以及没有脚本.git-completion.bash脚本的机器上仍然有效。

现在git Tab(实际上是git TabTab)的工作原理就像一种魅力!

ps:如果这不可行,则可能需要运行chmod u+x ~/.git-completion.bash以授予自己必要的权限:

  • chmod 是用于修改文件权限的命令
  • u 表示拥有文件的用户,默认情况下是文件的创建者,即您
  • + 表示设置/激活/添加权限
  • x 表示执行权限,即运行脚本的能力

1
是的,在添加bash脚本后重启终端使其可以工作。我坐在这里,想知道为什么Models当我点击m Tab使其自动完成到文件夹时,它一直尝试自动完成到我的文件夹master
2015年


3
如果接受的答案对任何人都无效,请尝试以下操作:source ~/.bash_profile粘贴代码后。重新启动终端也将执行相同的操作。

谢谢!我尝试了其他一些方法,但没有任何效果(包括github.com/bobthecow/git-flow-completion/wiki/…)。您的解决方案就像一个魅力;)
rgoliveira

1
(您没有brew,git但Apple默认git),brew install git并为面临奇怪错误的用户重启终端,例如git checunknown option: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>]
Sachin

89

有些人喜欢使用程序包管理器来自动安装,更新和配置Mac OS程序包。我是软件包管理器的爱好者,我认为Homebrew是Mac OS最好的软件包管理器(有人会说这是事实上的Mac OS软件包管理器)。

一旦你已经安装了自制,你可以简单地安装git的沿的bash完成brew install git bash-completion

然后,您需要将以下内容放入~/.bash_profile

if [ -f `brew --prefix`/etc/bash_completion.d/git-completion.bash ]; then
  . `brew --prefix`/etc/bash_completion.d/git-completion.bash
fi

(注意:如果此安装失败并出现404错误,并且您已经安装了git,则只需删除此brew安装的git部分)

有关在此处安装brew的git和bash-completion的更多信息。


27
添加git和添加与添加bash-completion根本不一样。.git-completion.bash 它们是不同的程序,它们执行的操作也完全不同-一种执行bash命令自动完成,另一种执行git命令自动完成,并且'nwa the twain会遇到;)
Michael Durrant

像魅力一样工作,非常感谢。您能否解释一下您添加了我的脚本的用途~/.bash_profile
维卡斯·班萨尔

尽管其他人对此回答有何评论,但这是使git自动完成功能在终端中起作用的一种方法。
伊恩

32

在终端上运行此命令:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

然后,执行以下操作:

vi ~/.bash_profile

添加以下行:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

就这样。这对我有用。


1
(第二步)如果有人喜欢使用文本编辑器打开bash_profile,只需执行以下操作:open -e .bash_profile
Nicolas Bodin-Ripert

2
在原始Mac OS High Sierra上,该~/.bash_profile文件不存在。只需创建文件并将该if脚本放在其中并保存,就可以了。之后重新加载您的外壳,它将起作用。
agm1984 '18 -10-19

11

git并且git-completion.bash已经随附了macOS命令行工具(xcode-select --install)。要启用bash自动完成功能,请将其添加到中~/.bash_profile

[ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ] && . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

这还将为git分支启用自动完成功能。


可以肯定的是我已经安装了命令行工具,但是在我的情况下该文件不存在。不过很高兴与brew一起使用(并且由于我的git也与brew一起使用,也许也更明智)。
drevicko

谢谢!IMO,这应该是带有绿色复选标记的答案。
geekisthenewcool

8

这是使您感到有些困惑的事情:您已经安装了brew或ports,但是您正在使用git in系统/usr/bin/。要检查此:

which git

如果看到,/usr/bin/git则说明brew的配置不正确,或者尚未通过brew安装git。

如果通过brew安装git,则为brew启用bash补全还将为git启用bash补全。这是因为/usr/local/etc/bash_completion实际上所有资源都来自/usr/local/bash_completion.d,并且git的brew软件包在那里安装了git完成脚本。


这是有道理的,但是您将如何“启用bash完成以进行酿造”?您正在丢失该怎么做,这应该是您答案的一部分
skplunkerin

我只是做这个(它的工作原理,谢谢)通过simplified.guide/macos/bash-completion,但自动完成是一个几秒钟的延迟......奇
skplunkerin

4

您可以在启用了“ bash_completion”选项的情况下从MacPorts安装bash和git。这可能是保持git和补全最新的最简单方法。

http://denis.tumblr.com/post/71390665/adding-bash-completion-for-git-on-mac-os-x-snow-leopard

要安装MacPorts:http : //www.macports.org/install.php/

附加信息

至于在Linux系统上查找完成设置,请查看/etc/bash_completion.d/git(这是一个长文件)。但是,由于它是由完成框架通过/ etc / bash_completion(其源于/etc/profile.d/bash_completion.sh;/etc/profile中的文件)而设计的,因此,仅靠自身复制可能不起作用。 .d来自/ etc / profile)。


2

如果您的git完成被部分破坏,即使在source之后https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash,您可能只需要更新git版本。

例如,当我键入git check+时TAB,它将正确地自动完成git checkout。但是当我输入git checkout+时TAB,它仅显示分支列表HEAD

对我来说,解决方法是更新我的git版本。我使用的是2.7.0,显然与最新版本不兼容git-completion.bash。我运行brew upgrade git,将其更新为2.13.0,现在它可以正确地自动完成我的分支名称。


我遇到了同样的问题,但是我必须运行brew upgrade gitbrew link git (启用覆盖)
Tope

1
感谢@Tope的帮助。我已更改updateupgrade
wisbucky

2

到目前为止,我已经找到了最好的参考解决这个问题很是SpinDance,由康纳利文斯顿

如果混帐completion.bash脚本不能在你的计算机上存在,请从我上面提供的(这是链接检索),并将其保存到本地计算机中的新文件名为混帐completion.bash/ usr / local / etc / bash_completion.d /目录。如果您的计算机上存在git-completion.bash脚本,但不在/usr/local/etc/bash_completion.d/目录中,则应在该目录中创建一个副本。快速sudo cp /current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash应该可以解决问题。对于那些对/usr/local/etc/bash_completion.d/感到好奇的人 目录:用于存储新的完成命令,如果您的计算机上不存在该命令,则可能必须创建该目录。

此时,git-completion.bash脚本应该在您的本地计算机上的/usr/local/etc/bash_completion.d/目录中。现在,我们通过〜/ .bash_profile指向git完成脚本,将其插入bash中

注意:上一行中的代字号是指计算机上的主目录。将以下行添加到〜/ .bash_profilesource /usr/local/etc/bash_completion.d/git-completion.bash并保存。最后一步是重新加载您的bash配置文件。您可以通过在当前bash会话中运行源〜/ .bash_profile来实现此目的。


1

尝试过它,它对分支机构很好,但是当您执行git st+时,tab它会显示这样的错误

未知选项:--list-cmds = list-mainporcelain,others,nohelpers,alias,list-complete,config用法:git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

搜索互联网,发现--list-cmdsin .git-completion.bash是最新版本的git,在我的mac上,git版本为2.17.2

这是解决方案

解决方案1

  1. 使用git --version命令检查git的版本
  2. 然后在网址中输入与我相同的版本号

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. 然后按照与顶部答案相同的步骤,将以下代码放入 ~/.bash_profile

    if [ -f ~/.git-completion.bash ]; then
      . ~/.git-completion.bash
    fi

解决方案2

您应该尝试将git版本更新到最新版本,然后它应该可以工作。


0

安装oh-my-zsh并将zsh设置为默认外壳,稍后再感谢我:)


我这样做是为了希望不必处理它-敲击选项卡后仍然没有分支机构建议
Jytug

实际上根本不需要oh-my-zsh,甚至根本不需要任何单独的插件系统!Git完成是开箱即用的,您只需要启用它即可。
SilverWolf

0

大多数用户将git在xcode命令行工具的一部分中安装,/usr/bin/git而git的bash完成规则将在上提供/Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

在这种情况下,无需从Homebrew安装git或从raw.githubusercontent.com获取git完成规则。只需创建一个符号链接,如下所示:

cd /usr/local/etc/bash_completion.d/
ln -s /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash git

注意:确保bash-completion已从Homebrew 安装并配置了软件包。


-2

找到您的.bashrc文件。

打开它,并在底部添加以下行:

source /etc/bash_completion.d/git


1
/etc/bash_completion.d/在相对较新的系统(OSX 10.10.3)上,我没有任何文件夹。
livingtech

尝试创建它。
crmpicco

不是bash_completion,git_completion会做不同的事情。
Michael Durrant


@crmpicco您能否提供创建说明/etc/bash_completion.d/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.