163

使用 OSX 的 git 时,在我修改一个文件后,我可以简单地执行此操作git commit <tab>,这会自动将文件名补全为被修改的文件名。但是,如果我从 homebrew 安装了更新版本的 git 并使用它,该功能将不再起作用(这意味着我按下<tab>它只是“询问”我想要在哪个文件上执行它,甚至包括那些没有更改的文件)。

任何人都可以解释为什么以及如何解决这个问题?我更喜欢使用自制的 git,因为它是最新的。

我的 shell 是 zsh,既不安装bash-completion也不zsh-completions工作(即使遵循自制软件的安装后说明)。

此外,在使用自制软件安装 git 后,它说

Bash completion has been installed to: /usr/local/etc/bash_completion.d
zsh completion has been installed to: /usr/local/share/zsh/site-functions

那么我不应该能够使用其中之一吗?

4

19 回答 19

314

您正在寻找:

brew install git bash-completion

正如warpc的评论所述,您需要将以下内容添加到您~/.bash_profile的自制软件的 bash-completion 工作中:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
fi

安装 bash-completion 公式时的注意事项中提到了上述内容。


注意:如果您使用的是 Bash v4 或更高版本(通过brew install bash),那么您将要使用brew install bash-completion@2, 来启用选项卡完成添加以下内容,~/.bash_profile如警告中所述:

export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"

git、docker、youtube-dl 和其他可能包含在$(brew --prefix)/etc/bash_completion.d/目录中的完成需要额外的导出。

于 2013-02-20T01:47:11.187 回答
120

这得到了在 OSX 上工作的 git tab 完成,而无需重新启动终端:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
echo "source ~/.git-completion.bash" >> ~/.bash_profile
source ~/.bash_profile

编辑:这在 Catalina 的默认 zsh shell 中不起作用。我将默认 shell 改回 bash,它又可以工作了。https://www.howtogeek.com/444596/how-to-change-the-default-shell-to-bash-in-macos-catalina/

于 2015-01-24T19:25:35.087 回答
24

万一其他人犯了我的愚蠢错误,请尝试brew install git. 我使用的git是 Xcode 附带的,但没有意识到我从未安装 Homebrew 的 git 来获取自动完成功能。

于 2016-12-20T21:00:55.033 回答
19

出于某种原因,我丢失了文件,$(brew --prefix)/etc/bash_completion所以@Graham Perks 的正确答案对我不起作用

在我的情况下,它最终的修复是:

brew unlink bash-completion
brew link bash-completion
于 2014-07-02T11:50:40.697 回答
11

我通过找出执行时$(brew --prefix)/etc/bash_completion返回的内容解决了这个问题Permission denied。所以经过一个简单的:

chmod +x $(brew --prefix)/etc/bash_completion

现在一切正常。不过,我想知道为什么 Homebrewbash_completion在安装时不会使文件可执行。

于 2015-08-18T22:33:12.237 回答
5

我有同样的问题,甚至今天早上发现了这篇文章。我通过更新 brewbrew update然后重新安装 git解决了这个问题brew reinstall git

然后我被通知另一个文件阻止自制链接过程,在我的情况下是/usr/local/share/zsh/site-functions/git-completion.bash. 删除文件并运行brew link git解决了这个问题。猜猜这只是我们偶然发现的一个糟糕的食谱版本。

于 2013-03-02T16:34:49.190 回答
5

找到了一个可行的解决方案。它是最近的(16 小时前创作,2 小时前提交),它直接来自 homebrew

brew install git --without-completions

刚刚试了一下,终于按预期工作了。

于 2013-03-02T21:09:49.623 回答
3

第 1 步:下载自动完成脚本:

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

第 2 步:更新 .bash_profile 和 .bashrc

echo "source ~/git-completion.bash" >> .bash_profile

通过https://www.anintegratedworld.com/git-tab-autocomplete-on-osx-10-11-el-capitan/

如果上述方法不起作用,请尝试https://github.com/bobthecow/git-flow-completion/wiki/Install-Bash-git-completion

于 2016-09-28T06:41:48.650 回答
3

如果你有$BASH_VERSION< 4.1,例如3.2.57(1)-release然后继续:

brew install bash-completion
# In ~/.bash_profile :
if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
fi

但是,如果您必须brew install bash获得版本4.4.12(1)-release ,您可以在以下方面使用更好、更完整的补全:

brew install bash-completion@2
# In ~/.bash_profile:
[ -f "$(brew --prefix)/share/bash-completion/bash_completion" ] \
&& . "$(brew --prefix)/share/bash-completion/bash_completion"

请注意,某些包(brew、docker、tmux)仍会添加一些完成,$(brew --prefix)/etc/bash_completion.d/因此您可以添加:

for completion in "$(brew --prefix)/etc/bash_completion.d/"*
do
    . $completion
done

最后,如果由于某种原因您安装 git 的方式没有将其添加到其中任何一个中,您应该能够添加 git 完成脚本:

[[ -f $(brew --prefix)/etc/bash_completion.d/git \
|| -f $(brew --prefix)/share/bash-completion/completions/git ]] \
|| curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash \
    -o $(brew --prefix)/etc/bash_completion.d/git

您可以使用上述方法获取并添加它。

于 2018-03-09T08:19:05.893 回答
2

在 2019 年,使用 Bash v5,您无需在您的.bash_profile.bashrc

  1. 确保您的文件中有以下两行.bashrc
export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
  1. 下载 git bash 完成脚本 ( https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash) 并将其保存/usr/local/etc/bash_completion.d/git

就是这样!Bash 将自动获取 git 完成文件并启用完成。


旁注:我建议将所有这些更改都放入,.bashrc因为这样可以确保当您放入交互式 shell(即 from pipenv shell)时,完成将正确加载,因为 bash 将 source.bashrc而 NOT .bash_profile

于 2019-10-09T16:58:43.233 回答
2

对于 macOS Catalina 上的 bash(3/30 更新: Big Sur 也是),如果您还想使用自制软件中的 Bash 5,您需要确保您的登录 shell设置为自制软件的 bash,而不是默认值。

要检查您是否需要这样做,请运行echo ${BASH_VERSION}. 如果您看到以 3 开头的版本,则说明您没有使用 Brew 的 bash 作为您的登录 shell。

要改变这一点,

  1. 打开System Preferences-> Users and Groups
  2. 右键单击您的用户并选择“高级选项”。您可能需要通过单击左下角的锁来使用密码解锁。
  3. 将该login shell字段设置为 brew 的 bash 的位置,通常可以在安装 brew 的 bash 后which bash在终端中运行来找到该位置。我的是。/usr/local/bin/bash

重新启动您的终端,并按照此出色答案中的说明进行操作

于 2020-10-29T17:10:10.287 回答
1

对我来说,我不得不把

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

进入.bashrc(不是 .bash_profile)以使其正常工作。

“.bash_profile 是为登录 shell 执行的,而 .bashrc 是为交互式非登录 shell 执行的”——来自.bash_profile 和 .bashrc 之间的区别是什么?在我看来,MacOS Sierra 在打开新终端窗口时不会执行.bash_profile,只有.bashrc.

我不会把它放在 _bash_profile 中,因为那样我必须重新启动/注销才能使更新生效。

于 2017-10-30T14:13:19.283 回答
1

这在 Mojave (OSX 10.14.1) 中对我有用:

brew install bash-completion

然后将以下行添加到您的 ~/.bash_profile:

[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
于 2018-11-07T19:12:15.607 回答
0

它可能与使用 libedit 而不是 Lion 中的 readline 有关。

尝试在 git 之前安装 readline。

brew install readline
于 2013-02-20T01:41:14.303 回答
0

对于那些已经安装了 brew bash-completion 的人。我没有安装 git 完成脚本,也找不到任何水龙头。

所以我手动添加了它:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o $(brew --prefix)/etc/bash_completion.d/git

请注意,您必须重命名文件并删除扩展名才能使其正常工作。

如果您没有安装完成或 git,请将其安装在接受的答案中。

brew install git bash-completion

于 2017-05-14T12:21:53.373 回答
0

如果你使用 homebrew 安装 git,那么可能不需要安装任何东西来支持 git 补全。“git-completion.bash”文件在某个地方(我的在这里:/usr/local/git/contrib/completion/git-completion.bash)

您需要做的就是找到该文件: sudo find / -type f -name "git-completion.bash"

然后在你的 .bash_profile 中获取它的路径。例如,我需要将此行添加到我的 ~/.bash_profile 中:

source /usr/local/git/contrib/completion/git-completion.bash

不要忘记获取您的 ~/.bash_profile 或重新打开终端;)

来自: how-enable-git-tab-completion-bash-mac-os-x

于 2018-12-24T17:00:42.507 回答
0

我知道这是一篇旧文章,但您实际上并不需要安装任何其他软件包。

Homebrew 通知您有一个目录,其中包含您需要的所有内容。

.bash_profile如果您使用 Bash ,您可以简单地将以下行添加到您的:

source /usr/local/etc/bash_completion.d/git-completion.bash
于 2019-05-13T17:02:08.840 回答
0

如果没有任何效果,可能是因为您有旧版本的bashbash 完成脚本,并且该脚本没有获取该/usr/local/etc/profile.d/bash_completion.sh脚本的来源。您可以通过在 file 的条件中添加一个简单的 echo 来测试它/usr/local/etc/profile.d/bash_completion.sh

 10         if shopt -q progcomp && [ -r /usr/local/Cellar/bash-completion@2/2.11/share/bash-completion/bash_completion ]; then
 11             # Source completion code.
                echo "doing bash completion or not"
 12             . /usr/local/Cellar/bash-completion@2/2.11/share/bash-completion/bash_completion

并打开一个新终端。如果您没有看到回显消息,则条件不会评估为真。就我而言,这是因为bash版本太旧,默认来自 mac 3.2.blah。

我确实从 brew 安装了一个更新的 bash,但我忘记了chsh,这让我很头疼。bash --version将返回 5.1.8 但启用的 shell 仍然是旧的 :) 要测试启用的 bash 你可以做

for n in {0..5}
do
  echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done

修复是sudo chsh -s /usr/local/bin/bash在完成工作之后。

于 2021-06-13T06:04:19.897 回答
-1

在 MAC-OS Mojave 10.14 上启用 GIT 命令的自动完成 我是一名开发人员,一直在命令行中使用 GIT。当我考虑开发角度时,我曾经使用命令行执行很多命令来进行 GIT 操作。大多数情况下,MAC OS 没有自动支持我部分支持的命令完成,这很烦人。以及命令建议,这意味着可用于键入字符的命令是什么。因此,键入很长的命令并且大部分是重复性的任务,因为打字错误是非常麻烦的。:(

Tab 补全肯定会更快更容易。不幸的是,在某些 Mac 计算机上默认安装的 git 没有启用制表符补全。

因此,我正在寻找解决问题的方法,并且从网络搜索(例如 StackOverflow、GitHub 以及媒体)中找到了几种解决方案。不幸的是,这些解决方案对我不起作用,并且对多次尝试不同的解决方案感到沮丧。

我正在深入搜索并尝试不同的解决方案,幸运的是,这是一个简单的解决方案。以下是我从几个帖子中收集的步骤,最后它按预期工作。所以我希望与像我一样有这个问题的人分享。

如果你去网络搜索,你可以找到许多提到 git 完成 bash 文件的解决方案。甚至 GitHub 指南也是如此。但我建议您首先检查 git-completion.bash 文件是否已经在您的 MAC 计算机中,其中包含 git-core 或其他来自安装的东西。您可以使用以下命令。

sudo find / -type f -name "git-completion.bash"

你会得到以下结果。(根据内容可能会有一些差异)

/Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
/Users/Dilanka/git-completion.bash
/Users/Dilanka/.oh-my-zsh/plugins/gitfast/git-completion.bash
/Users/Dilanka/Downloads/git-completion.bash

我建议你选择从 git-core 安装的

如果您的机器上不存在 git-completion.bash 脚本,请从上面提供的下方检索它,并将其保存到本地机器的 /usr/local/etc/ 中名为 git-completion.bash 的新文件中bash_completion.d/ 目录。

https://git-scm.com/book/en/v1/Git-Basics-Tips-and-Tricks

如果您使用 Bash shell,Git 附带了一个不错的自动完成脚本,您可以启用它。直接从 Git 源代码下载它

https://github.com/git/git/blob/master/contrib/completion/git-completion.bash

如果 git-completion.bash 脚本存在于您的机器上,但不在 /usr/local/etc/bash_completion.d/ 目录中,您应该创建该目录并将文件复制到其中。下面的命令将完成这项工作:

sudo mkdir /opt/local/etc/bash_completion.d
sudo cp /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash

以上完成后。git-completion.bash 脚本应该存在于本地机器的 /usr/local/etc/bash_completion.d/ 目录中。

现在您需要使用以下命令刷新您的个人资料。它会将您添加的 bash 文件加载到终端上下文中。

source ~/.bash_profile

伟大的!!!你已经做到了。只需启动终端窗口并尝试一下。只需输入“git sta”,它将显示如下建议:

git sta
stage    stash    status
git chec<TAB> will show git checkout

在这里查看我的 GitHub 帖子:

https://github.com/DIL8654/Enable-Auto-Completion-of-GIT-commads-on-MAC-OS-Mojave

在这里查看我的中等帖子:

https://medium.com/@dilanka85/enable-auto-completion-of-git-commands-on-mac-os-mojave-10-14

于 2019-01-05T20:50:27.880 回答