zsh를 사용한 Git 완료: 공백이 있는 파일 이름이 올바르게 이스케이프되지 않습니다.

zsh를 사용한 Git 완료: 공백이 있는 파일 이름이 올바르게 이스케이프되지 않습니다.

자식 완성:

내 시스템에서 git 파일 이름 자동 완성에 문제가 있습니다. 저는 OS X (10.9.3) 에서 zsh(5.0.5) 와 (1.9.3) 을 사용하고 있습니다 git. 둘 다 homebrew를 통해 설치 zsh되었습니다 git. (풀버전 출력은 포스팅 하단에 있습니다.)

git파일 이름 완성 시 예상한 대로 공백이 삽입되지 않았습니다. 이름에 공백이 포함된 파일 이름을 입력하면 쉘은 공백을 이스케이프하지 않고 파일 이름을 삽입합니다. zsh의 내장 완성 기능은 이를 수행하지 않지만 gits는 수행합니다.

다음은 제가 본 것의 예입니다.

이름에 공백이 있는 파일이 있는 저장소가 있습니다.

% ls -la
test
test four - latest.txt
test three.txt
test two

탭 완성을 사용하여 파일 이름을 삽입하면 쉘 백슬래시가 예상대로 파일 이름을 이스케이프합니다.

% echo "testing" >> test<tab>

Tab 키를 세 번 누르면 자동으로 수행됩니다.

% echo "testing" >> test\ four\ -\ latest.txt
––– file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

git status다음 파일 이름을 따옴표로 표시합니다(무슨 일이 일어나고 있는지 완전히 이해합니다).

% git status --short
 M test
 M "test four - latest.txt"
 M "test three.txt"
 M "test two"

하지만 탭 자동 완성을 사용하려고 하면 git add왜곡됩니다.

% git add test<tab>

Tab 키를 세 번 누르면 다음과 같은 결과가 나타납니다.

% git add test four - latest.txt
test                    test four - latest.txt  test three.txt          test two

나는 이것을 회귀하려고 시도했습니다. 내 도트 파일은 버전 제어에 있으므로 그것을 시도했고 이것이 작동한다고 거의 확신했던 1년 전의 도트 파일도 시도했습니다 zsh 4.3.15. git 1.8.3이상하게도 이 설정은 여전히 ​​깨졌습니다.

가지다_git다음에서 시작되는 완료 파일 로 범위를 좁힙니다 /usr/local/share/zsh/site-functions.

% echo $FPATH
/usr/local/share/zsh/site-functions:/usr/local/Cellar/zsh/5.0.5/share/zsh/functions
% ls -l /usr/local/share/zsh/site-functions
_git@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/_git
_hg@ -> ../../../Cellar/mercurial/3.0/share/zsh/site-functions/_hg
_j@ -> ../../../Cellar/autojump/21.7.1/share/zsh/site-functions/_j
git-completion.bash@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/git-completion.bash
go@ -> ../../../Cellar/go/HEAD/share/zsh/site-functions/go

$FPATH실행하기 전에 수동으로 변경하거나 심볼릭 링크만 제거 하면 완료가 다시 진행되어 예상대로 작동합니다..zshrccompinit/usr/local/share/zsh/site-functions/_gitzsh

zsh다음 없이 완료 _git:

% git add test<tab>

올바른 결과를 얻으려면 Tab 키를 세 번 누르세요.

% git add test\ four\ -\ latest.txt
––– modified file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

참고 사항: 링크를 제거하려고 시도했지만 git-completion.bash모든 것이 완전히 중단되었습니다.

% git add test<tab>

이러한 파괴성을 생성하려면 다음을 수행하십시오.

% git add test__git_zsh_bash_func:9: command not found: __git_aliased_command
    git add test
––– file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

진짜이것이 작동하도록 하고 싶습니다. 나머지 _git완성은 그 것보다 저장소를 더 잘 인식하기 때문에 훌륭 zsh하지만 제대로 이스케이프하려면 공백이나 기타 특수 문자가 포함된 파일 이름이 필요합니다.


소프트웨어 버전:

% zsh --version
zsh 5.0.5 (x86_64-apple-darwin13.0.0)

% git --version
git version 1.9.3

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.9.3
BuildVersion:   13D65

내가 업로드한 파일은 다음 _gitgit-completion.bash같습니다.git-completion.bash그리고_git(CloudApp으로 이름을 바꾸면 _git.sh브라우저에 표시됩니다.)

답변1

이 오류는메일링 리스트.

해결 방법은 파일을 편집 git-completion.zsh하고 in -Q옵션을 제거하는 것입니다.compadd__gitcomp_file

--- i/contrib/completion/git-completion.zsh
+++ w/contrib/completion/git-completion.zsh
@@ -90,7 +90,7 @@ __gitcomp_file ()

    local IFS=$'\n'
    compset -P '*[=:]'
-   compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
+   compadd -p "${2-}" -f -- ${=1} && _ret=0
 }

 __git_zsh_bash_func ()

이 파일은 contrib/completion디렉터리에서 설치되며 해당 경로는 패키지 관리자에 따라 다를 수 있습니다. macOS에서 homebrew를 사용하여 설치한 경우 /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.

관련 정보