2014-11-04 10 views
9

Ho qualche strano comportamento riguardo il mio setup che non riesco a restringere.Il completamento della scheda si blocca solo per i comandi Git

Sto usando il completamento delle schede nella mia shell senza problemi (la mia shell è zsh). Il problema che sto avendo riguarda il completamento della scheda dopo l'emissione di un comando git.

Esempio 1 (funziona bene):

Faccio una nuova directory, il cambiamento in esso e git init. Ho quindi touch hello.rb. Se faccio git add <tab> lo cambierò a git add hello.rb.

Esempio 2 (non funziona):

Sono in un app rotaie che in realtà non è molto grande, e se provo a correre git add G<tab> con l'intento che possa tirare sulla mia Gemfile, semplicemente si blocca e si blocca fino a quando uccido con ctrl-c che uscite:

Killed by signal in __git_complete_index_file after 159s 

In zsh sto usando:

# completion 
autoload -U compinit 
compinit 

Qualcun altro ha riscontrato questo problema? Posso aggirarlo, ma devo fare qualcosa di sbagliato e non so dove altro guardare.

Versioni di cose:

git version 2.1.2 
zsh 5.0.7 
iTerm2 Build 2.0.0.20141103 

Aggiornamento:

Git v 2.2.0 ha risolto questo problema così appena l'aggiornamento se si sta eseguendo in questo problema.

+1

Confermo questo numero – 907th

risposta

7

Suppongo che tu stia utilizzando RVM o qualche strumento del genere.

C'è un bug nel git-completion.bash fornito con git corrente (2.1.3) e versioni precedenti, causando un ciclo infinito quando si elencano i completamenti di file nelle directory in cui viene utilizzato RVM.

Il motivo di questo ciclo infinito è un cambiamento di chpwd_functions, eseguito da RVM e alcuni altri strumenti.

Ho trovato a patch per git-comletion.bash che riguarda solo il metodo __git_ls_files_helper utilizzato per elencare i file. La patch ignora lo chpwd_functions e quindi, questi loop infiniti vengono omessi.

In breve: La funzione __git_ls_files_helper deve essere cambiata da:

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

a:

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

Ulteriori informazioni possono essere trovate nel RVM issue discussion on Github. La posizione di git-completion.bash dipende da come è stato installato git.Quando si utilizza Homebrew, la posizione è qualcosa come

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

su altri sistemi, o quando si utilizzano altri gestori di pacchetti, di solito dovrebbe essere qualcosa di simile

/opt/local/etc/bash_completion.d 

Per ulteriori informazioni circa il git-completion.bash , dai un'occhiata a Git Tips and Tricks, capitolo 2.7 nel libro git-scm.com.

Aggiornamento:

Git v 2.2.0 ha risolto questo problema così appena l'aggiornamento se si sta eseguendo in questo problema.

+0

Grazie Tobias! Aspetterò che git si fonda nel commit ma questo è esattamente il mio problema. – Anthony

+1

AFAIK questo potrebbe non essere stato corretto su Git v 2.2.0 (ho provato quella versione). Ho anche aggiornato alla 2.3.0 e il processo 'zsh' si bloccherebbe con il 100% di utilizzo della CPU per> 15 secondi prima che il completamento della scheda fosse completato (su una cartella con solo 23 file). – isaacbernat

+1

Stavo usando 'zsh 4.3.11'. Passare a 'zsh 5.0.7' ha risolto il problema per me. – isaacbernat

Problemi correlati