我假设您正在使用 RVM 或类似的工具。
当前 git (2.1.3) 和旧版本附带的 git-completion.bash 中有一个错误,在使用 RVM 的目录中列出文件完成时会导致无限循环。
这种无限循环的原因是chpwd_functions
由 RVM 和其他一些工具进行的更改。
我发现git-comletion.bash的补丁__git_ls_files_helper
只影响用于列出文件的方法。补丁忽略了chpwd_functions
,因此这些无限循环被省略了。
简而言之:__git_ls_files_helper
功能需要从:
__git_ls_files_helper ()
{
(
test -n "${CDPATH+set}" && unset CDPATH
cd "$1"
if [ "$2" == "--committable" ]; then
git diff-index --name-only --relative HEAD
else
# NOTE: $2 is not quoted in order to support multiple options
git ls-files --exclude-standard $2
fi
) 2>/dev/null
}
至:
__git_ls_files_helper ()
{
(
test -n "${CDPATH+set}" && unset CDPATH
(( ${+functions[chpwd]} )) && unfunction chpwd
(( ${#chpwd_functions} )) && chpwd_functions=()
setopt chaselinks
builtin cd "$1" 2>/dev/null
if [ "$2" == "--committable" ]; then
git diff-index --name-only --relative HEAD
else
# NOTE: $2 is not quoted in order to support multiple options
git ls-files --exclude-standard $2
fi
) 2>/dev/null
}
更多信息可以在 Github 上的 RVM 问题讨论中找到。git-completion.bash 的位置取决于您安装 git 的方式。使用 Homebrew 时,位置类似于
/usr/local/Cellar/git/<git version>/etc/bash_completion.d/
在其他系统上,或者在使用其他包管理器时,通常应该是这样的
/opt/local/etc/bash_completion.d
有关 git-completion.bash 的更多信息,请查看 git-scm.com 书中的 Git Tips and Tricks,第 2.7 章。
更新:
Git v 2.2.0 已修复此问题,因此如果您遇到此问题,只需升级即可。