2014-11-04 33 views
9

Mam dziwne zachowanie dotyczące mojej konfiguracji, której nie mogę zawęzić.Zakończanie zakładki zatrzymuje się tylko dla poleceń Git.

Używam uzupełniania kart w mojej powłoce bez żadnych problemów (moja powłoka to zsh). Problem, który mam, dotyczy zakończenia karty po wydaniu polecenia git.

Przykład 1 (działa poprawnie):

robię nowy katalog, przejdź do niego i git init. Ja następnie touch hello.rb. Jeśli wykonam git add <tab>, zmieni się on na git add hello.rb.

Przykład 2 (nie działa):

jestem w aplikacji szyn, które naprawdę nie jest bardzo duża, a jeśli próbuję uruchomić git add G<tab> z zamiarem, że będzie to podciągnąć mój Gemfile, to po prostu wisi i wisi aż zabiję go ctrl-c która wyprowadza:

Killed by signal in __git_complete_index_file after 159s 

W zsh Używam:

# completion 
autoload -U compinit 
compinit 

Czy ktoś jeszcze miał ten problem? Mogę obejść to, ale muszę zrobić coś złego i nie jestem pewien, gdzie jeszcze szukać.

Wersje rzeczy:

git version 2.1.2 
zsh 5.0.7 
iTerm2 Build 2.0.0.20141103 

Aktualizacja:

Git v 2.2.0 ustaliła ten problem, więc po prostu uaktualnić jeśli używasz w tej kwestii.

+1

Potwierdzam ten numer – 907th

Odpowiedz

7

Zakładam, że używasz RVM lub jakiegoś takiego narzędzia.

Występuje błąd w git-completion.bash dostarczany z bieżącym git (2.1.3) i starszymi wersjami, powodując niekończącą się pętlę podczas wpisywania uzupełnień plików w katalogach, w których używany jest RVM.

Powodem tej nieskończonej pętli jest zmiana chpwd_functions, dokonana przez RVM i kilka innych narzędzi.

Znalazłem a patch dla git-comletion.bash, który dotyczy tylko metody __git_ls_files_helper używanej do wyświetlania listy plików. Łata ignoruje wartości chpwd_functions i stąd te nieskończone pętle są pomijane.

W skrócie: Funkcja __git_ls_files_helper musi zostać zmieniony z:

__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 
} 

do:

__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 
} 

Więcej informacji można znaleźć w RVM issue discussion on Github. Lokalizacja twojego git-completion.bash zależy od tego, w jaki sposób zainstalowałeś git.Podczas korzystania z Homebrew, lokalizacja jest coś

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

w innych systemach, lub przy użyciu innych menedżerów pakietów, zwykle powinno być coś jak

/opt/local/etc/bash_completion.d 

W celu uzyskania dalszych informacji na temat git-completion.bash , spójrz na porady i porady Git, rozdział 2.7 w książce git-scm.com.

Aktualizacja:

Git v 2.2.0 ustaliła ten problem, więc po prostu uaktualnić jeśli używasz w tej kwestii.

+0

Dzięki Tobias! Zamierzam poczekać, aż git się połączy, ale to jest właśnie mój problem. – Anthony

+1

AFAIK może nie zostało to naprawione w Git v 2.2.0 (próbowałem tej wersji). Zaktualizowałem także do wersji 2.3.0 i proces 'zsh' zawiesza się przy 100% obciążeniu procesora przez> 15 sekund przed zakończeniem tabulacji (w folderze zawierającym tylko 23 pliki). – isaacbernat

+1

Używałem 'zsh 4.3.11'. Przejście na 'zsh 5.0.7' naprawiło problem dla mnie. – isaacbernat