베어 Git 저장소를 사용하여 Zsh 파일 자동 완성

베어 Git 저장소를 사용하여 Zsh 파일 자동 완성

내 .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-dirzsh가 충분히 새로운 경우(≥5.3) 완료 코드는 이를 인식하고 완료할 작업을 찾을 때 이를 고려합니다. 인수를 환경 변수로 전달하여 --git-dir이를 수행합니다 GIT_DIR. 예를 들어 원격 이름을 사후 완성하려면 git fetchzsh 를 실행하세요 git remote. 그런 다음 git --git-dir=/some/where해당 환경에서 zsh가 실행됩니다 git remote. GIT_DIR=/some/where그래서 이 부분이 작동합니다.

불행하게도 현재 zsh 버전(5.7.1+)에서는 통과합니다.확장되지 않은토론. 따라서 그런 식으로 작성하면 git --git-dir=~/repositories/foo.gitzsh는 통과 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을 호출했다는 사실도 알 수 없습니다.

이 패치가 작동하지 않거나 자신의 버전을 유지하고 싶지 않은 경우 _gitgit을 래핑하는 사용자 정의 완료 기능을 사용하여 사용자 정의 명령을 정의하여 이 문제를 해결할 수 있습니다.

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.

관련 정보