2014-11-04 11 views
9

내 설정과 관련하여 좁힐 수없는 이상한 동작이 있습니다.Git 명령에 대해서만 탭 완성이 멈 춥니 다.

내 셸에서 탭 완성을 사용하고 있습니다 (내 셸은 zsh 임). 내가 가지고있는 문제는 git 명령을 실행 한 후 탭 완료와 관련이 있습니다.

예 1 (잘 작동) :

내가 그것을하고 git init에 새로운 디렉토리를 변경합니다. 그럼 touch hello.rb입니다. git add <tab>을 입력하면 git add hello.rb으로 변경됩니다.

예 2 (작동하지 않습니다) :

을 정말 매우 큰 아닌 레일 응용 프로그램에있어, 나는 그것을 끌어 것을 목적으로 git add G<tab>를 실행하려고하면 내 내가 zsh을에서

Killed by signal in __git_complete_index_file after 159s 

사용하고

: Gemfile, 그냥 내가 ctrl-c으로 죽일 때까지 출력하는 응답 및 응답

# completion 
autoload -U compinit 
compinit 

다른 누구도이 문제가 있습니까? 나는 그걸 해결할 수는 있지만 뭔가 잘못된 일을해야하고 다른 볼 곳이 확실치 않습니다. 사물의

버전 :

git version 2.1.2 
zsh 5.0.7 
iTerm2 Build 2.0.0.20141103 

업데이트 :

힘내 V 2.2.0은이 문제에 실행하는 경우 그래서 그냥 업그레이드이 문제를 해결했다.

+1

이 문제를 확인했습니다. – 907th

답변

7

저는 RVM이나 그런 도구를 사용한다고 가정합니다.

git-completion.bash에 현재 git (2.1.3) 및 이전 버전과 함께 제공되는 버그로 인해 RVM이 사용되는 디렉토리에 파일 완료를 나열 할 때 무한 루프가 발생합니다.

이 무한 루프의 원인은 chpwd_functions이며 RVM 및 기타 도구로 변경되었습니다.

파일을 나열하는 데 사용되는 __git_ls_files_helper 메소드에만 영향을주는 git-comletion.bash에 대해 a patch을 찾았습니다. 패치는 chpwd_functions을 무시하므로이 끝없는 루프는 생략됩니다. 요컨대

는 다음 __git_ls_files_helper 함수로 변경 될 필요 :

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

에 :

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

추가 정보가 RVM issue discussion on Github에서 찾을 수있다. git-completion.bash의 위치는 git의 설치 방법에 따라 다릅니다.브루를 사용하는 경우, 위치는

/usr/local/Cellar/git/<git version>/etc/bash_completion.d/ 
다른 시스템에

, 또는 다른 패키지 관리자를 사용하는 경우, 그것은 일반적으로 자식-completion.bash에 대한 자세한 내용은

/opt/local/etc/bash_completion.d 

과 같이해야 같은입니다 , git-scm.com 책의 Git Tips and Tricks, 2.7 장을보십시오.

업데이트 :

힘내 V 2.2.0은이 문제에 실행하는 경우 그래서 그냥 업그레이드이 문제를 해결했다.

+0

감사합니다. Tobias! 나는 자식이 커밋을 병합 할 때까지 기다릴 것이다. 그러나 이것은 정확하게 나의 문제점이다. – Anthony

+1

AFAIK Git v 2.2.0에서 수정되지 않았을 수 있습니다 (해당 버전을 사용해 보았습니다). 또한 2.3.0으로 업데이트되었고'zsh' 프로세스는 탭 완성이 완료되기 전에 (단지 23 개의 파일이있는 폴더에서) 15 초 이상 100 % CPU 사용률로 중단됩니다. – isaacbernat

+1

'zsh 4.3.11'을 사용하고있었습니다. 'zsh 5.0.7'로 전환하면 문제가 해결되었습니다. – isaacbernat