다음을 사용하여 도트 파일을 추적합니다.
- 베어 저장소는 에 있습니다
$HOME/repos/dotfiles
. - 내 모든 도트 파일은 일반 위치에 있습니다
$HOME/.vim/vimrc
.$HOME/repos/dotfiles/vimrc
- 나는
git --git-dir=$HOME/repos/dotfiles --work-tree=$HOME ...
일을 관리하기 위해 달린다.
(실제로 . g()
에 있을 때 위의 명령으로 확장되는 기능이 있고 $HOME
, 그렇지 않으면 git
.)
빼고는 다 괜찮습니다...
질문:Zsh git 파일 이름 완성이 작동하지 않습니다.
예:
% pwd
/home/brian
% g status ~
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .vim/vimrc
modified: .xmonad/xmonad.hs
no changes added to commit (use "git add" and/or "git commit -a")
% g add <Tab>
Completing not a git repository
('완료 중...' 내용이 마감되었습니다 zstyle ':completion:*' format $'%{\e[0;31m%}Completing %B%d%b%{\e[0m%}'
.)
zsh의 git 완료에 주어진 "move to/follow" 값을 마치 해당 디렉토리에서 호출된 --work-tree
것처럼 알려주는 것만으로는 충분하지 않다는 점은 주목할 가치가 있습니다 git
. 그렇게 해도 명시적으로 작동하지 않기 때문입니다.
% cd repos/dotfiles
% g status
fatal: This operation must be run in a work tree
% g add <Tab>
Completing not a git repository
질문:zsh의 git 완성을 이 상황으로 확장하는 쉬운 방법이 있습니까?
답변1
zsh
불행히도 이는 git 완료 프로세스의 버그입니다. "zsh" 메일링 리스트에서 토론을 찾을 수 있습니다.여기.
Daniel Shahaf는 "_git"에 대한 패치를 제공했습니다.
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 518e6d198..45a0fa622 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -6609,20 +6609,33 @@ __git_files_relative () {
(( $+functions[__git_files] )) ||
__git_files () {
local compadd_opts opts tag description gitcdup gitprefix files expl
+ local pref
zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F:
zparseopts -D -E -a opts -- -cached -deleted -modified -others -ignored -unmerged -killed x+: --exclude+:
tag=$1 description=$2; shift 2
- gitcdup=$(_call_program gitcdup git rev-parse --show-cdup 2>/dev/null)
- __git_command_successful $pipestatus || return 1
+ case $(_call_program gitinworktree git rev-parse --is-inside-work-tree 2>/dev/null) in
+ (true)
+ gitcdup=$(_call_program gitcdup git rev-parse --show-cdup 2>/dev/null)
+ __git_command_successful $pipestatus || return 1
- gitprefix=$(_call_program gitprefix git rev-parse --show-prefix 2>/dev/null)
- __git_command_successful $pipestatus || return 1
+ gitprefix=$(_call_program gitprefix git rev-parse --show-prefix 2>/dev/null)
+ __git_command_successful $pipestatus || return 1
+
+ local pref=$gitcdup$gitprefix$PREFIX
+ ;;
+ (false)
+ local pref=
+ ;;
+ (*)
+ # XXX what to do?
+ return 1
+ ;;
+ esac
# TODO: --directory should probably be added to $opts when --others is given.
- local pref=$gitcdup$gitprefix$PREFIX
# First allow ls-files to pattern-match in case of remote repository
files=(${(0)"$(_call_program files git ls-files -z --exclude-standard ${(q)opts} -- ${(q)${pref:+$pref\\\*}} 2>/dev/null)"})
@@ -7585,7 +7598,8 @@ _git() {
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:git-$words[1]:
- (( $+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_WORK_TREE=${(e)opt_args[--work-tree]}
if ! _call_function ret _git-$words[1]; then
if zstyle -T :completion:$curcontext: use-fallback; then
_default && ret=0
그것은 분명히 작동 zsh 5.4.1
하지만 나에게는 작동하지 않습니다, YMMV.
문제가 해결되면 이 답변을 업데이트하겠습니다.
편집하다:
위의 패치를 사용하면 작동하지만 어디에 배치하느냐가 add
중요합니다. 패치는 마지막에 있어야 합니다.
git --git-dir=$HOME/.dotfiles --work-tree=$HOME/ add
한 가지 더 주목할 점은 속도가 조금 느리다는 것입니다.
답변2
최신(2018-04-20) 공식 git 완성은 매우 잘 작동합니다.
https://github.com/git/git/tree/master/contrib/completion
설치하다,
mkdir -p ~/.zsh && cd $_
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
# The default behavior for 'git <TAB><TAB>' is to show a 10+ lines 'common commands' list.
# I prefer a full list.
# Better way to modify?
sed -i.bak '/^__git_zsh_cmd_common/,/{/ s/{/{\n\treturn/' _git
# add zshrc settings
vi ~/.zshrc
fpath=(~/.zsh $fpath)
# the next two lines are not needed if using oh-my-zsh
autoload -Uz compinit
compinit
추신,
내 이전 답변은 oh-my-zsh 플러그인 gitfast에 관한 것이었습니다. 하지만 버그가 있고 매우 구식입니다.