如何在 Mac OSX 上完成分支名称的 Git?

How To Get Git Completion For Branch Names On Mac OSX?

我试了好几天调试这个问题都没有成功。我已尽最大努力在我的机器上安装 git 和 git 完成,但是我仍然无法自动完成分支名称(本地或远程)。然而,完成 git 子命令工作得很好。

我有一个 Mac 运行 Sierra 10.12.5.

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.5
BuildVersion:   16F73

我正在使用 bash,通过 Homebrew 安装。

$ brew info bash | head -1
bash: stable 4.4.12 (bottled), HEAD

我已经通过 Homebrew 安装了 git。

$ brew info git | head -1
git: stable 2.13.1 (bottled), HEAD

我已经安装了 bash-completion via Homebrew。

$ brew info bash-completion | head -1
bash-completion: stable 1.3 (bottled)

我已经找到了必要的脚本。

$ source $(brew --prefix)/etc/bash_completion

我已经确认 git-completion.bash 实际上在 bash_completion.d 目录中。

$ ll /usr/local/etc/bash_completion.d/git-completion.bash
lrwxr-xr-x  1 michael  65 Jun 18 02:19 /usr/local/etc/bash_completion.d/git-completion.bash -> ../../Cellar/git/2.13.1/etc/bash_completion.d/git-completion.bash

使用 git 时,我在尝试自动完成命令时看到了正确的自动完成行为。

$ git che{tab}
checkout cherry cherry-pick

但是,分支名称补全似乎根本不起作用。相反,自动完成尝试建议另一个子命令

$ git checkout{tab}
add annotate apply archive bisect [...list continues]

git 知道这个存储库的其他分支(远程和本地)。

$ git branch -a
  master
* foo
  remotes/origin/HEAD -> origin/master
  remotes/origin/bar
  remotes/origin/foo
  remotes/origin/master

但是,git无论我提示多少字母,都不会提示另一个分支。

$ git checkout ma{tab}     # => nothing
$ git checkout mas{tab}    # => nothing
$ git checkout mast{tab}   # => nothing
$ git checkout maste{tab}  # => nothing

这发生在我机器上的每个 git 存储库中,而不是孤立于一个。我拥有读取和写入这些存储库的必要权限。

我已经尝试卸载/重新安装 git 和 bash-完成。我试过直接从 Github 获取规范的 git-completion.bash 脚本并改为采购它。我试图删除我所有的 git 点文件以排除这些。

我遇到的所有指南似乎都暗示我的自动完成问题将通过下载最新的 git-completion.bash(如上链接)并获取它来解决,但遗憾的是在这种情况下不会削减它。 Bash 补全似乎对其他工具(例如 tmux)正常工作,所以我相信这个问题是本地化的 git 补全。

我错过了什么吗?我需要采取哪些额外步骤来激活分支名称的完成?

问题在于您使用的 bash 版本。现代 bash 完成配置脚本需要比 Apple 附带的 macOS 更新的 bash。您需要 a) 安装更新的 bash; b) 将其添加到 /etc/shells; c) 使用 chsh(或系统首选项 > 用户和组 > unlock/authenticate > 右键单击​​帐户 > 高级选项)更改您帐户的 shell。