Автодополнение ZSH для git занимает много времени, могу ли я отключить или оптимизировать его?

Автозаполнение вкладок Git полезно для небольших проектов, но в настоящее время я работаю над двумя большими проектами, использующими git, и для них это хуже, чем бесполезно. Всякий раз, когда я набираю, скажем, git add forms<tab>, git требуется 20 или более секунд, чтобы найти файл (в данном примере, forms.py), и в этот промежуток времени я больше ничего не могу сделать в терминале. Есть ли способ отключить функцию автозаполнения или как-то ускорить ее?


person haroba    schedule 21.03.2012    source источник
comment
Какую оболочку вы используете?   -  person Johnsyweb    schedule 21.03.2012
comment
Я использую zsh, и я хотел бы использовать стандартное автозаполнение имени файла zsh, а не git.   -  person haroba    schedule 21.03.2012
comment
Кстати, set -x достаточно, чтобы увидеть/доказать, какое автодополнение занимает слишком много времени.   -  person MarcH    schedule 03.10.2017
comment
@Johnsyweb: первая строка git-completion.bash: bash/zsh completion support for core Git   -  person MarcH    schedule 03.10.2017


Ответы (6)


Это не git автоматически заполняет имена файлов, это ваша оболочка. У вас такая же задержка при выполнении, например. "формы кошек‹ вкладка >"?

Проверьте этот пост с похожими проблемами:

http://talkings.org/post/5236392664/zsh-and-slow-git-completion

В этом посте предлагается добавить следующее в ваш .zshrc:

__git_files () { 
    _wanted files expl 'local files' _files     
}

РЕДАКТИРОВАТЬ: Вот оригинальный текст этого поста

Я нашел много сообщений с жалобами на мучительно медленное автозаполнение git в больших репозиториях. Были предложены различные исправления и предложения по загрузке последней версии zsh. Возможно, одна из этих вещей сработает, но все, что я действительно хочу, это чтобы имена ветвей и файлов завершались так, как они есть в файловой системе. Я не нашел никаких предложений о том, как получить такое поведение, поэтому я понял это для себя. Я подумал, что поделюсь этим со всеми, кому это может быть полезно. Я только что добавил следующее в свой файл .zshrc:

__git_files () { 
    _wanted files expl 'local files' _files  }

Теперь я могу запускать команды git и получать почти мгновенное завершение, в то же время получая завершение файла, аналогичное тому, что обеспечивает ls.

person ralphtheninja    schedule 21.03.2012
comment
Если я добавлю файл в .gitignore, завершение табуляции после команды git больше не будет работать с этим файлом. - person haroba; 21.03.2012
comment
Ok. Пожалуйста, проверьте мой исправленный ответ. Вероятно, это связано со связью между вашей оболочкой и git. - person ralphtheninja; 21.03.2012
comment
Спасибо, это сработало! Интересно, должен ли я отправить отчет об ошибке git или zsh, поскольку решение очень неинтуитивное. - person haroba; 21.03.2012
comment
Ваше решение сработало как шарм, но ссылка не работает. Не могли бы вы объяснить, что это делает? Спасибо - person Mariano; 21.05.2013
comment
Для тех, кто спрашивает, кажется, что __git_files — это функция, используемая для автозаполнения git, и эта новая функция сканирует файловую систему вместо связи с git. - person WouterH; 25.06.2013
comment
Кажется, это не имеет значения для меня (я не должен, чтобы мой репо состоял из множества неотслеживаемых, игнорируемых файлов, и я использую Cygwin ZSH). Очевидно, что-то не так на моей машине. Любые предложения, как я могу диагностировать несоответствие? - person Sridhar Sarnobat; 21.02.2014
comment
Убедитесь, что вы поместили эту команду перед вашими плагинами zsh, иначе вы можете получить быстрое автозаполнение, но ошибки при попытке запустить команду git. - person Simon; 22.04.2015

Наконец-то надоело ужасно медленное автодополнение в zshell, и я начал искать решение. В итоге я переключился с «git» на использование плагина «gitfast», который уже установлен с моим zsh, и я лечу... https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#gitfast

person Mark Nadig    schedule 24.10.2013
comment
Добро пожаловать ????. Если вам интересна история . - person FelipeC; 06.06.2019

У меня нет опыта работы с zshell, но я получил этот ответ на другом форуме. Вам нужно включить эту строку в ваш файл .zshrc:

compdef -d git
person caveman    schedule 21.03.2012
comment
К сожалению, это приводит к сбою завершения команд git. Например, если вы наберете git ch<TAB>, он не выдаст список допустимых команд git. - person amcnabb; 22.03.2012
comment
Во многих командах git первым аргументом может быть либо ветка, либо имя файла. Иногда вы хотите завершить на имени файла (что всегда должно быть очень быстро), а затем вам нужно очень долго ждать, просматривая все ветки, которые вам не нужны. Отключение завершения git устраняет эту частую проблему. - person MarcH; 03.10.2017
comment
Да, это отключает автозаполнение, а это именно то, о чем просил ОП. - person FelipeC; 06.06.2019
comment
Слава Богу, я нашел этот ответ. Нажатие ‹Tab› в любом репозитории с большими файлами LFS приводило к зависанию zsh. Теперь завершение имен файлов в таких командах, как 'git diff filename', выполняется мгновенно, потому что оно просто выполняет сопоставление файлов. - person user3243135; 10.09.2020

Это связано с тем, что Zsh по умолчанию поставляется с чрезвычайно раздутым завершением для Git. Я написал сообщение в блоге объясняя, как я исправил это раздутие, но это должно было быть вне проекта Zsh.

Простой ответ — установить дополнение Git zsh, которое отличается от завершения git Zsh (которое поставляется по умолчанию). Загрузите git-completion.zsh и поместите его в свой ~/.zsh/_git. Затем поместите его на свой fpath:

fpath=(~/.zsh $fpath)

Ты должен лететь сейчас.

Как объясняет другой комментарий здесь; другой вариант — использовать oh-my-sh и включить gitfast, который делает то же самое.

Почему разработчики Zsh настаивают на том, чтобы сделать их код медленным? Я не знаю, но здесь вы можете увидеть образец их рассуждений: Re : проблема с медлительностью при завершении git.

person FelipeC    schedule 06.06.2019

Одно очень быстрое и грязное решение — удалить следующий файл, отвечающий за автозаполнение.

/usr/local/git/contrib/completion/git-completion.bash
person caveman    schedule 21.03.2012
comment
Я не могу этого сделать, так как я не единственный пользователь на этом сервере, и другие могут или не могут захотеть использовать автозаполнение git. Кажется странным, что у git не было бы простого решения для чего-то, что, если я что-то не понимаю, происходит со всеми проектами git, когда они становятся большими. - person haroba; 21.03.2012
comment
@Aqwis: не используйте этот файл в сценарии запуска оболочки. - person mipadi; 21.03.2012
comment
Его нет в моем сценарии запуска оболочки. - person haroba; 21.03.2012
comment
К тому же это неважно: это для Баша, у него проблема с Зш. По умолчанию Zsh загружает свои раздутые дополнения. - person FelipeC; 06.06.2019

Согласно ответу на git bash auto complete slow на Windows 7 x64, git 2.13 поставляется с более быстрым git-completion.bash

person MarcH    schedule 03.10.2017
comment
Но это для ЗШ, а не Баша. - person FelipeC; 06.06.2019
comment
@FelipeC, в вашем собственном блоге объясняется, что возможно (не говоря уже о том, что рекомендуется) использовать git-completion.bash в zsh. - person MarcH; 07.06.2019
comment
Да, но вы не объяснили, как. - person FelipeC; 07.06.2019
comment
Вы прокомментировали и проголосовали против, даже не указав на собственное объяснение. Странный. - person MarcH; 07.06.2019
comment
Вот что происходит, когда вы загружаете этот файл в zsh: ПРЕДУПРЕЖДЕНИЕ: этот скрипт устарел, см. git-completion.zsh. Я написал это предупреждение не просто так, и разработчики Git согласились; вам нужно использовать новый метод. Да, вы по-прежнему можете сделать это, но это не рекомендуется, так как это устарело уже много лет, и нам, вероятно, уже следует удалить его. - person FelipeC; 07.06.2019