【问题标题】:Tab completion freezes for Git commands only仅 Git 命令的制表符完成冻结
【发布时间】:2014-12-31 16:04:26
【问题描述】:

我的设置有一些奇怪的行为,我似乎无法缩小范围。

我在我的 shell 中使用制表符完成没有任何问题(我的 shell 是 zsh)。我遇到的问题是在发出git 命令后完成制表符。

示例 1(工作正常):

我创建了一个新目录,将其更改为 git init。然后我touch hello.rb。如果我这样做git add <tab>,它会将其更改为git add hello.rb。

示例 2(不起作用):

我在一个真正不是很大的 Rails 应用程序中,如果我尝试运行 git add G<tab> 并意图它会拉起我的 Gemfile,它只会挂起并挂起,直到我用ctrl-c 输出:

Killed by signal in __git_complete_index_file after 159s

在 zsh 中我正在使用:

# completion
autoload -U compinit
compinit

还有其他人遇到过这个问题吗?我可以解决它,但我必须做错事,而且我不确定还能去哪里看。

事物的版本:

git version 2.1.2
zsh 5.0.7
iTerm2 Build 2.0.0.20141103

更新:

Git v 2.2.0 已修复此问题,因此如果您遇到此问题,只需升级即可。

【问题讨论】:

标签: git shell zsh tab-completion iterm2


【解决方案1】:

我假设您正在使用 RVM 或类似的工具。

当前 git (2.1.3) 和旧版本附带的 git-completion.bash 中有一个错误,导致在使用 RVM 的目录中列出文件完成时出现无限循环。

这个无限循环的原因是 chpwd_functions 的变化,由 RVM 和其他一些工具做的。

我发现 git-comletion.bash 的 a patch 仅影响用于列出文件的 __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
}

更多信息请参见RVM issue discussion on Github。 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 已修复此问题,因此如果您遇到此问题,只需升级即可。

【讨论】:

  • 感谢托拜厄斯!我将等待 git 合并到提交中,但这正是我的问题。
  • AFAIK 这可能还没有在 Git v 2.2.0 上得到修复(我试过那个版本)。我还更新到 2.3.0,zsh 进程会在完成制表符完成之前以 100% 的 CPU 使用率挂起 > 15 秒(在只有 23 个文件的文件夹上)。
  • 我使用的是zsh 4.3.11。切换到zsh 5.0.7 为我解决了这个问题。
  • 太棒了 :-) 我已经能够确认,该修复程序已集成在 git 2.2.0 中。仅供参考:这是应该解决问题的提交:github.com/git/git/commit/…
  • 嘿@DrumM,您使用的是哪个 ZSH 版本?如果我重新考虑正确,如果您有旧的 ZSH 或旧的 git,则会出现此问题。
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多