git - 如何在 Mac OSX 上获取分支名称的 Git 补全?

标签 git bash macos homebrew macos-sierra

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

我有一台运行 Sierra 10.12.5 的 Mac。

$ 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

我已经通过 Homebrew 安装了 bash-completion。

$ 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-completion。我试过捕获规范 git-completion.bash直接从 Github 获取脚本并改为采购。我试图删除我所有的 git 点文件以排除这些。

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

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

最佳答案

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

关于git - 如何在 Mac OSX 上获取分支名称的 Git 补全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44614025/

相关文章:

git - 在 git repo 中控制大文件使用的最佳策略是什么?

git - linux-next 和 linux-net-history git 存储库有什么区别?

mysql - 使用 Bash 添加一行作为新的 MySql 条目

perl - 我如何在 Perl 的 system() 中使用 bash 语法?

android - 在 Mac OS X Lion 上构建 Android 4.0

git - 如何组合这些 git 命令?

git - 在存储库的副本之间传输 stash 的更改

linux - 在 bash 中打印文件夹名称

objective-c - 如何在 OS X 10.6 上构建可在 10.5 上运行的应用程序和框架?

macos - “Undefined is not a function”在Dashcode中播放声音