2014-11-04 18 views
9

Tôi có một số hành vi lạ về thiết lập của mình mà tôi dường như không thể thu hẹp.Tab đóng băng hoàn toàn cho lệnh Git chỉ

Tôi đang sử dụng hoàn thành tab trong trình bao của mình mà không gặp bất kỳ sự cố nào (vỏ của tôi là zsh). Vấn đề tôi gặp phải là hoàn thành tab sau khi phát hành lệnh git.

Ví dụ 1 (hoạt động tốt):

tôi thực hiện một thư mục mới, thay đổi vào nó và git init. Sau đó, tôi touch hello.rb. Nếu tôi làm git add <tab>, nó sẽ đổi thành git add hello.rb.

Ví dụ 2 (không hoạt động):

Tôi đang ở một ứng dụng đường ray đó thực sự không phải là rất lớn, và nếu tôi cố gắng chạy git add G<tab> với mục đích rằng nó sẽ kéo lên của tôi Gemfile, nó chỉ bị treo và bị treo cho đến khi tôi giết nó với ctrl-c mà kết quả đầu ra:

Killed by signal in __git_complete_index_file after 159s 

Trong zsh tôi đang sử dụng:

# completion 
autoload -U compinit 
compinit 

Có ai khác có vấn đề này không? Tôi có thể làm việc xung quanh nó nhưng tôi phải làm điều gì đó sai và tôi không chắc chắn nơi khác để xem xét.

phiên bản thứ:

git version 2.1.2 
zsh 5.0.7 
iTerm2 Build 2.0.0.20141103 

Cập nhật:

Git v 2.2.0 đã cố định vấn đề này vì vậy chỉ cần nâng cấp nếu bạn đang chạy vào vấn đề này.

+1

Tôi xác nhận vấn đề này – 907th

Trả lời

7

Tôi giả sử bạn đang sử dụng RVM hoặc một số công cụ tương tự.

Có lỗi trong git-completion.bash được chuyển với phiên bản git (2.1.3) và cũ hơn, gây ra vòng lặp vô tận khi liệt kê tệp hoàn thành trong thư mục nơi sử dụng RVM.

Lý do cho vòng lặp vô tận này là thay đổi của chpwd_functions, được thực hiện bởi RVM và một số công cụ khác.

Tôi đã tìm thấy a patch cho git-comletion.bash chỉ ảnh hưởng đến phương thức __git_ls_files_helper được sử dụng cho tệp danh sách. Các miếng vá bỏ qua các chpwd_functions và do đó, các vòng vô tận được bỏ qua.

Nói tóm lại: Chức năng __git_ls_files_helper cần phải được thay đổi từ:

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

tới:

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

Thông tin bổ sung có thể được tìm thấy trong RVM issue discussion on Github. Vị trí của git-completion.bash của bạn phụ thuộc vào cách bạn đã cài đặt git.Khi sử dụng Homebrew, vị trí là một cái gì đó giống như

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

trên các hệ thống khác, hoặc khi sử dụng cán bộ quản lý gói khác, nó thường nên một cái gì đó giống như

/opt/local/etc/bash_completion.d 

Để biết thêm thông tin về git-completion.bash , hãy xem Git Tips and Tricks, chương 2.7 trong cuốn sách git-scm.com.

Cập nhật:

Git v 2.2.0 đã cố định vấn đề này vì vậy chỉ cần nâng cấp nếu bạn đang chạy vào vấn đề này.

+0

Cảm ơn Tobias! Tôi sẽ chờ git để hợp nhất trong cam kết nhưng điều này là chính xác vấn đề của tôi. – Anthony

+1

AFAIK điều này có thể chưa được khắc phục trên Git phiên bản 2.2.0 (Tôi đã thử phiên bản đó). Tôi cũng cập nhật lên 2.3.0 và quá trình 'zsh' sẽ bị treo với mức sử dụng CPU 100% trong> 15 giây trước khi hoàn tất tab (trên một thư mục chỉ với 23 tệp). – isaacbernat

+1

Tôi đã sử dụng 'zsh 4.3.11'. Chuyển sang 'zsh 5.0.7' đã khắc phục sự cố cho tôi. – isaacbernat

Các vấn đề liên quan