自制的“ git”没有使用补全

在使用 OSX 的 git 时,在修改文件之后,我可以简单地执行 git commit <tab>操作,这将自动完成文件名的修改。然而,如果我从自制软件中安装了一个新版本的 git 并使用它,这个功能就不再起作用了(这意味着我按下 <tab>,它就会“询问”我想在哪个文件上执行操作,甚至包括那些没有更改的文件)。

有人能解释一下为什么会这样,以及如何解决这个问题吗?我更喜欢用自制的 Git,因为它更新。

我的 shell 是 zsh,安装 bash-completionzsh-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

我不能用这个吗?

67627 次浏览

这可能与 libedit 在 Lion 中被使用而不是 readline 有关。

尝试在 git 之前安装 readline。

brew install readline

你要找的是:

brew install git bash-completion

正如 warpc 的评论所说,你需要在你的 ~/.bash_profile中添加以下内容来让你的自制程序 bash 完成工作:

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

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


注意: 如果您正在使用 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/目录中的完成操作,需要额外的导出。

我也有同样的问题,今天早上我甚至发现了这篇文章。我修复了这个问题,使用 brew update更新 bret,然后使用 brew reinstall git重新安装 git。

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

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

brew install git --without-completions

刚试了一下,终于如愿以偿了。

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

结果我的情况是:

brew unlink bash-completion
brew link bash-completion

这是在 OSX 上运行的 git 选项卡补全程序,不需要重启终端:

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/

我通过计算 $(brew --prefix)/etc/bash_completion在执行时返回 Permission denied来解决这个问题:

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

现在一切都工作正常。我想知道为什么家酿没有使 bash_completion文件在安装时可执行,但。

步骤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

如果有人犯了我的愚蠢错误,试试 brew install git。我使用的是 Xcode 附带的 git,并没有意识到我从来没有安装家酿的 git 来获得自动补全功能。

对于那些已经安装了 bash 完成的人来说。我没有安装 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

对我来说,我不得不把

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

转换为 .bashrc(而不是. bash _ profile)以使其工作。

”. bash _ profile 对登录 shell 执行,而. bashrc 执行 在我看来,MacOS Sierra 在打开一个新的终端窗口时不执行 .bash_profile,只执行 .bashrc

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

如果你的 $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

您可以获取并添加它与以上。

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

brew install bash-completion

然后在 ~/. bash _ profile 中添加以下代码行:

[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion

如果您使用自制软件安装 git,那么可能不需要安装任何东西来支持 git 完成。 “ git-complete. bash”文件在某个地方(我的文件在这里:/usr/local/git/Contrib/complete/git-complete. bash)

你只需要找到文件: Sudo find/-type f-name“ git-complete. bash”

然后在. bash _ profile 中找到它的路径。 例如,我需要将这一行添加到我的 ~/. bash _ profile:

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

不要忘记为 ~/. bash _ profile 提供源代码或重新打开终端;)

来自: 如何启用-git-tab-补全-bash-mac-os-x

在 MAC-OS Mojave 10.14上启用 GIT 命令的自动完成 我是一个开发人员,一直从命令行使用 GIT。当我考虑开发的角度时,我过去常常使用 GIT 操作的命令行执行许多命令。大多数时候,MAC 操作系统不能自动支持我部分支持的命令完成是非常恼人的。以及命令建议,这意味着可用于类型化字符的命令是什么。所以输入很长的命令和大部分重复的任务是非常麻烦的,因为输入错误。:(

制表完成当然会更快更容易。不幸的是,在一些 Mac 计算机上默认安装的 git 没有启用选项卡补全。

因此,我一直在寻找解决这个问题的方法,并且从网络搜索中找到了一些解决方案,比如 StackOverflow、 GitHub 以及媒体。不幸的是,这些解决方案并不适合我,并且因为多次尝试不同的解决方案而感到沮丧。

我一直在深入探索,尝试不同的解决方案,幸运的是,这是一个简单的解决方案。下面是我从几篇文章中收集到的步骤,最终它像预期的那样工作了。所以我希望和其他像我一样有这个问题的人分享。

如果你去网络搜索,你可以找到许多解决方案,其中提到了 git 完成 bash 文件。甚至还有 GitHub 指南。但我建议您首先检查 git 完成。Bash 文件已经在你的 MAC 计算机与 git 核心或其他来自安装。你可以使用以下命令。

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 完成。Bash 脚本在您的计算机上不存在,请从上面提供的下面检索它,并将其保存到您的本地计算机中的一个名为 git 完成的新文件中。/usr/local/etc/bash _ complete 中的 bash。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 完成。Bash 脚本存在于您的机器上,但不在/usr/local/etc/bash _ complete 中。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-complete. bash 脚本应该存在于/usr/local/etc/bash _ complete. 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

我知道这是一篇老文章,但是你真的不需要安装任何额外的软件包。

家酿是通知你,有一个目录,所有的东西,你需要的。

如果您正在使用 Bash,您可以简单地在 .bash_profile中添加以下代码行:

source /usr/local/etc/bash_completion.d/git-completion.bash

在2019年,使用 Bash v5,您不需要在 .bash_profile.bashrc中显式地提供 git Bash 完成脚本

  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)并将其保存为 git

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


附注: 我建议将所有这些更改放在 .bashrc中,因为这样可以确保在进入交互式 shell 时(即。从 pipenv shell) ,完成将被正确加载,因为 bash 将源 .bashrc和 NOT.bash_profile

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

若要检查是否需要执行此操作,请运行 echo ${BASH_VERSION}。如果您看到一个以3开头的版本,那么您的登录 shell 并没有使用 Brew 的 bash。

为了改变这一切,

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

重新启动您的终端,并按照 这个绝妙的答案中的说明操作

如果没有工作,这可能是因为您有一个旧版本的 bash和 bash 完成脚本没有得到来源的 /usr/local/etc/profile.d/bash_completion.sh脚本。您可以通过在文件 /usr/local/etc/profile.d/bash_completion.sh中的条件语句中添加一个简单的 echo 来测试这一点:

 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

然后开一个新的终端。如果您没有看到 echo 消息,那么条件句的计算结果就不会是 true。在我的案例中,这是因为 bash版本过时了,是 mac 3.2的默认版本。废话。

我确实安装了一个新的 bash 从酿造,但我忘了 chsh,这使我很头痛。bash --version将返回5.1.8,但启用的 shell 仍然是旧的 shell:)要测试启用的 bash,您可以这样做

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

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

在为这个问题烦恼了很久之后,我发现当我安装了 hub命令时,hub命令的完成正在破坏 git的完成。我必须移除 /usr/local/etc/bash_completion.d/hub.bash_completion.sh。这意味着对 hub 没有完成,但是 git 完成现在可以工作了。我没有调试为什么会这样。

我安装了以下的啤酒包:

  • Bash: 5.1.16
  • Bash-complete@2:2.11
  • Git: 2.35.1
  • Hub: 2.14.2