내 .zshrc에 다음이 있습니다.
# command completion
autoload -Uz compinit
compinit
일반적으로 명령, 매개변수 및 파일을 찾아볼 수 있습니다.
그러나 git --git-dir=<the path> --work-tree="$HOME"
(일반적으로 별칭) 경우 파일이 아닌 하위 명령(예: 추가 및 푸시)과 매개변수에 대해서만 작동합니다. 파일도 처리할 수 있었으면 좋겠습니다.
나는 그것을 다음과 같은 스크립트에 넣어 보았습니다.
#!/usr/bin/env sh
git --git-dir=<the path> --work-tree="$HOME" "$@"
파일에서는 작동하지만 하위 명령과 인수는 중단됩니다.
감사해요.
답변1
명령줄에 있는 경우 --git-dir
zsh가 충분히 새로운 경우(≥5.3) 완료 코드는 이를 인식하고 완료할 작업을 찾을 때 이를 고려합니다. 인수를 환경 변수로 전달하여 --git-dir
이를 수행합니다 GIT_DIR
. 예를 들어 원격 이름을 사후 완성하려면 git fetch
zsh 를 실행하세요 git remote
. 그런 다음 git --git-dir=/some/where
해당 환경에서 zsh가 실행됩니다 git remote
. GIT_DIR=/some/where
그래서 이 부분이 작동합니다.
불행하게도 현재 zsh 버전(5.7.1+)에서는 통과합니다.확장되지 않은토론. 따라서 그런 식으로 작성하면 git --git-dir=~/repositories/foo.git
zsh는 통과 GIT_DIR=~/repositories/foo.git
하지만 통과되지는 않습니다 GIT_DIR=/home/aaa/repositories/foo.git
.
zsh 완료 코드가 올바르지 않습니다 --work-tree
.
파일을 편집하고 줄을 바꾸면 확장 문제를 해결 --git-dir
하고 지원을 추가 할 수 있을 것 같습니다.--git-worktree
_git
(( $+opt_args[--git-dir] )) && local -x GIT_DIR=$opt_args[--git-dir]
통과
(( $+opt_args[--git-dir] )) && local -x GIT_DIR=${(e)~opt_args[--git-dir]}
(( $+opt_args[--work-tree] )) && local -x GIT_WORKTREE=${(e)~opt_args[--work-tree]}
나는 이것을 테스트하지 않았습니다.
나는 zsh 메일링 리스트에 게시할 만큼 의욕이 없지만 그렇게 하십시오. 이 패치(또는 작동하지 않는 경우 작동하는 버전)는 유용한 패치가 될 것입니다.
--git-dir
또는 별칭을 넣으면 --work-tree
이는 투명합니다. zsh는 완료하기 전에 별칭을 확장합니다(해당 옵션을 끄지 않는다고 가정 complete_aliases
). 이를 함수나 스크립트 안에 넣으면 불투명합니다. zsh는 이를 볼 수 없으며, 사용자가 지시하지 않는 한 해당 함수나 스크립트가 git을 호출했다는 사실도 알 수 없습니다.
이 패치가 작동하지 않거나 자신의 버전을 유지하고 싶지 않은 경우 _git
git을 래핑하는 사용자 정의 완료 기능을 사용하여 사용자 정의 명령을 정의하여 이 문제를 해결할 수 있습니다.
gitx () {
git --git-dir=/some/where --work-tree=/else/where "$@"
}
_gitx () {
local -x GIT_DIR=/some/where GIT_WORKTREE=/else/where
_git "$@"
}
compdef _gitx gitx
래퍼가 여러 개인 경우 각 래퍼에는 완성 기능이 필요합니다. 또는 완료 함수에 일부 논리를 추가하여 사용할 GIT_DIR
합계 값을 결정할 수 있습니다. GIT_WORKTREE
함수 이름은 에 있습니다 $service
.