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