Завершение вкладки зависает только для команд Git

у меня есть странное поведение относительно моей установки, которую я не могу сузить.

я использую завершение вкладки в моей оболочке без каких-либо проблем (моя оболочка zsh). Проблема, с которой я сталкиваюсь, касается завершения вкладки после выдачи .

Пример 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 исправил эту проблему, поэтому просто обновите, если вы столкнулись с этой проблемой.

1 ответов


Я предполагаю, что вы используете RVM или какой-то инструмент.

в Git-завершении есть ошибка.bash поставляется с текущей git (2.1.3) и более старыми версиями, вызывая бесконечный цикл при перечислении завершений файлов в каталогах, где используется RVM.

причиной этого бесконечного цикла является изменение chpwd_functions, сделанный RVM и некоторыми другими инструментами.

я нашел патч для ГИТ-сворачивание.bash влияет только на __git_ls_files_helper способ который используется для перечисления файлов. Патч игнорирует chpwd_functions и, следовательно, эти бесконечные циклы опущены.

короче:__git_ls_files_helper функция должна быть изменена с:

__git_ls_files_helper ()
{
  (
    test -n "${CDPATH+set}" && unset CDPATH
    cd ""
    if [ "" == "--committable" ]; then
      git diff-index --name-only --relative HEAD
    else
      # NOTE:  is not quoted in order to support multiple options
      git ls-files --exclude-standard 
    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 "" 2>/dev/null
    if [ "" == "--committable" ]; then
      git diff-index --name-only --relative HEAD
    else
      # NOTE:  is not quoted in order to support multiple options
      git ls-files --exclude-standard 
    fi
  ) 2>/dev/null
}

дополнительная информация может быть найдена в RVM обсуждение вопроса на Github. Расположение вашего git-завершения.bash зависит от того, как вы установили git. При использовании Homebrew, расположение что-то вроде

/usr/local/Cellar/git/<git version>/etc/bash_completion.d/

on другие системы, или при использовании других менеджеров пакетов, это обычно должно быть что-то вроде

/opt/local/etc/bash_completion.d

для получения дополнительной информации о git-завершении.Баш, взгляните на советы и приемы Git, глава 2.7 в git-scm.com книга.

обновление:

Git V 2.2.0 исправил эту проблему, поэтому просто обновите, если вы столкнулись с этой проблемой.