Zsh 프롬프트로 Giit 웨어하우스 정보 표시

24961 단어 GitZshtech

개요


Zsh를 사용하여 Giit 창고 상태를 표시하는 Zsh 스크립트를 만듭니다.구체적으로 말하면
  • 분기 이름 표시
  • 상태는 브랜치 이름의 색상으로 표시
  • 상류 지점의 유무와 상태를 색깔로 표시
  • 이루어지다단지 상술한 내용을 실현하고 싶은 사람,vcsinfo나git-proompt를 사용하는 것이 더 빠를 것 같습니다.

    힌트를 만지작거리다


    기트와 서브버젼 등의 창고를 이용하면 그 창고의 상태를 확인하고 싶어하는 경우가 많다.Giit의 경우 분기 이름, 커밋되지 않음, 미루지 않음 상태를 프롬프트에 표시하고 싶습니다.다른 사람들도 루트인지 아닌지를 잘 알고 힌트에 대해 다양한 사용자 정의를 할 수 있을 거라고 생각합니다.
    물론 이러한 수요를 위해 다양한 수요가 있을 수 있지만, 얻기 어려운 기회라면 하나하나 기능을 확인하면서 이런 Zsh 스크립트를 만들어보자.
    최종적으로 함수git-prompt를 만들어서 현재 Giit 창고의 상태를 표시하고 그 값PROMPT이나 RPROMPT을 마음에 드는 곳에 두십시오.
    코드는 다음과 같이 공개됩니다.다양한 상태의 창고를 만드는 메이크 파일이 있기 때문에 디버깅에도 사용할 수 있다.
    https://github.com/kaityo256/zsh_vcs

    구조 함수


    우선 함수를 만들어 집행합시다.function 할 수 있어요.아래의 문서는 예를 들어 zshrc_git.zsh의 이름으로 제작되었다.
    function git-prompt{
      echo "main"
    }
    
    git-prompt
    
    함수 하나만 생성하고 호출합니다.시행해 보다.
    $ source zshrc_git.zsh
    main
    
    git-prompt만 실행했고 echo로 나타났다.

    색칠하다


    창고의 상태를 색깔로 표현하고 싶으니 색칠을 해 보세요.이를 위해 main라는 이름의 껍질 함수를 읽는다.
    autoload -U colors; colors
    function git-prompt{
      echo "${fg[green]}main${reset_color}"
    }
    
    git-prompt
    
    이 동작을 실행한 후 녹색 디스플레이colors를 사용해야 한다.
    첫 번째main는 껍질 함수를 읽어야 하는 성어다.autoload -U colors; colors 읽기autoload func만 있으면 실행되지 않습니다.따라서 바로 사용하고 싶을 때func.autoload func;funcautoload -X func 옵션은 즉시 실행되지만 현재 설정된alias를 계승합니다.-Xls 등은 주로 사용자 측에서 알리스를 설정하는데 이를 조개 함수에 계승하면 오작동을 일으킬 수 있다.따라서 보통 알리스 읽기를 계승하지 않는 옵션cp을 추가합니다-U.autoload -U func-U는 동시에 지정할 수 없으며 즉시 사용하려면-X.autoload -U func; func 실행 후 사용 가능colors.예를 들어 fg[色] 색상을 녹색으로 설정합니다.이렇게 하면 다른 표시도 녹색을 유지하기 때문에 ${fg[green]}로 색깔을 원상태로 회복한다.

    현재 분기 이름 가져오기


    현재 지점${reset_color}은 빼낼 수 있습니다.
    $ git symbolic-ref --short HEAD
    main
    
    참고로 git symbolic-ref --short HEAD 옵션은 이전에 없었어요.이 옵션이 없으면 이 내용이 표시됩니다.
    $ git symbolic-ref HEAD
    refs/heads/main
    
    에서 지점 이름을 얻으려면sed 같은 것이 필요하지만 지금--short에는 찾을 수 있기 때문에 필요 없습니다.
    또한 Giit 창고가 아닌 경우 표준 오류 출력에 다음과 같은 내용이 표시됩니다.
    $ git symbolic-ref --short HEAD
    fatal: not a git repository (or any of the parent directories): .git
    
    따라서 표준 오류 출력을 건너뛰고--short 표준 출력에 나타나면 지점 이름이고 아무것도 없으면 Giit 창고가 아니다.이곳에서 HEAD를 얻을 수 있을 거라고 생각하지 마세요.
    위에서 말한 바와 같이 각본은 다음과 같다.
    autoload -U colors; colors
    
    function git-prompt {
      local branchname
      branchname=`git symbolic-ref --short HEAD 2> /dev/null`
      if [ -z $branchname ]; then
        return
      fi
      echo "${fg[green]}${branchname}${reset_color}"
    }
    
    git-prompt
    
    여기에if문장의 조건식/dev/null[ -z $branchname ] 명령의 줄임말이다.test 옵션은 다음 문자열의 길이가 0일 때 진짜가 됩니다.이런 느낌이에요.
    test -z "";echo $?      # => 0
    test -z "hoge";echo $?  # => 1
    
    -z는 진짜일 때 0으로 되돌아오니 주의해야 한다.이렇게 되면
    if [ -z $branchname ]; then
      return
    fi
    
    test가 공문자라는 뜻으로, 지트의 창고가 아니면 진짜가 되고 그때는 아무것도 하지 않는다는 뜻$branchname이다.

    상황을 조사하다


    브랜치 이름의 색상으로 상태를 나타냅니다.먼저 제출하지 않거나 초록색도 제출하지 않으며 Untracked files와 노란색이 있습니다. 이외에 빨간색을 선택하십시오.
    우선 실행return, 표시git status는 녹색입니다.이외에 nothing to commit, working tree clean로 나타나면 노란색이고 그 외에 빨간색이다.그 이상을 솔직하게 실행하면 이런 느낌이 들겠죠.
    autoload -U colors; colors
    
    function git-prompt {
      local branchname branch st
      branchname=`git symbolic-ref --short HEAD 2> /dev/null`
      if [ -z $branchname ]; then
        return
      fi
      st=`git status 2> /dev/null`
      if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
        branch="${fg[green]}($branchname)$reset_color"
      elif [[ -n `echo "$st" | grep "^nothing added"` ]]; then
        branch="${fg[yellow]}($branchname)$reset_color"
      else
        branch="${fg[red]}($branchname)$reset_color"
      fi
    
      echo "$branch"
    }
    
    git-prompt
    
    nothing added to commit but untracked files present (use "git add" to track)branch의 변수를 새로 가져왔습니다.st의 실행 결과git stutus가 받아들여졌고, st가 포함된 문자열은 녹색이고, nothing to가 포함된 문자열은 노란색이며, 이외에 빨간색이다.또한 브랜치 이름은 괄호로 묶습니다.
    창고로 한번 해보세요.nothing added 창고kaityo256/zsh_vcs에서sample_dir 몇 개의 디렉터리[1]를 만들 수 있습니다.
    git clone https://github.com/kaityo256/zsh_vcs.git 
    cd zsh_vcs
    cd sample_dir
    make
    
    각각
  • make00 이후(노란색이어야 함)
  • git init01 이후
  • git init;git add02 이후(녹색이어야 함)
  • 네.실상
    cd sample_dir
    make
    cd 00
    source ../../zshrc_git.zsh 
    
    같은 건 예상 색상대로 브랜치 이름을 말할 수 있는지 확인하는 게 좋을 것 같아요.어떤 디렉터리에서
    git branch -m hoge
    source ../../zshrc_git.zsh 
    
    로서 지점명을 얻었는지 잘 확인해 보는 것도 좋다.

    업스트림 브랜치


    이어 상위 지점의 취득과 상위 지점의 차이를 조사했다.상류 지점의 취득 방법은 여러 가지가 있지만 git init;git add;git commit로 얻는 것은 비교적 쉽다.git config에 업스트림 브랜치를 설정하면 얻을 수 있습니다.업스트림 브랜치가 없으면 아무것도 표시되지 않습니다.
    원격 브랜치를 표시할 수 있지만 어차피 나는 git config branch.ブランチ名.remote만 사용하기 때문에 상위 브랜치가 있으면 브랜치 이름 옆에 origin를 표시하고 이 색을 사용하지 않았는지 판정한다.
    상위 지점이 있으면 [up] 미적용 제출이 있는지 조회할 수 있습니다.아무것도 안 보이면 차별이 없어요.
    종합적으로 말하면 이런 느낌이죠.
      remote=`git config branch.${branchname}.remote 2> /dev/null`
    
      if [ -z $remote ]; then
        pushed=''
      else
        upstream="${remote}/${branchname}"
        if [[ -z `git log ${upstream}..${branchname}` ]]; then
          pushed="${fg[green]}[up]$reset_color"
        else
          pushed="${fg[red]}[up]$reset_color"
        fi
      fi
    
      echo "$branch$pushed"
    
    어렵지 않아요.git log 上流ブランチ..現在のブランチ 변수
  • 업스트림 브랜치가 없는 경우 빈 문자열
  • 업스트림 브랜치가 있는 경우pushed
  • 로컬과 차이가 없는 경우 그린
  • 로컬과 차이가 있는 경우 빨간색
  • 그냥다시 한 번 검사해 보세요[up].예컨대sample_dir라면
    cd 03
    source ../../zshrc_git.zsh 
    
    면 초록색03으로 표시해야 합니다.
    각 디렉토리의 상태는 다음과 같습니다.
  • (main)[up] 누르지 않은 상태로 원격 웨어하우스 설치03
  • [up] 원격 창고 설치, 누르지 않음04
  • [up] 원격 창고 설치, 커밋되지 않음, 누르지 않음(빨간색 분기 이름은 녹색05
  • 으로 표시해야 함)
    그렇습니다.

    RPROMPT로 설정


    다음에 나오는 문자열을 PROPT나 RPROMPT에 삽입하면 됩니다. 이렇게 설정하면 표시가 이상해집니다.색상이 바뀐 도피 시퀀스의 문자열을 문자로 계산하기 때문이다.이런 상황을 방지하기 위해서는 색깔이 바뀐 곳을 [up]%{로 포위해야 한다.이상에서 수정한 내용은 다음과 같다.
    autoload -U colors; colors
    
    function git-prompt {
      local branchname branch st remote pushed upstream
      branchname=`git symbolic-ref --short HEAD 2> /dev/null`
      if [ -z $branchname ]; then
        return
      fi
      st=`git status 2> /dev/null`
      if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
        branch="%{${fg[green]}%}($branchname)%{$reset_color%}"
      elif [[ -n `echo "$st" | grep "^nothing added"` ]]; then
        branch="%{${fg[yellow]}%}($branchname)%{$reset_color%}"
      else
        branch="%{${fg[red]}%}($branchname)%{$reset_color%}"
      fi
    
      remote=`git config branch.${branchname}.remote 2> /dev/null`
    
      if [ -z $remote ]; then
        pushed=''
      else
        upstream="${remote}/${branchname}"
        if [[ -z `git log ${upstream}..${branchname}` ]]; then
          pushed="%{${fg[green]}%}[up]%{$reset_color%}"
        else
          pushed="%{${fg[red]}%}[up]%{$reset_color%}"
        fi
      fi
    
      echo "$branch$pushed"
    }
    
    RPROMPT='`git-prompt`%{$fg_bold[cyan]%}[%~]%{$reset_color%}'
    setopt prompt_subst
    
    제 취미는 오른쪽에 현재 디렉터리를 파란색으로 표시하고 왼쪽으로 이동하거나 줄을 나누는 것입니다. 마음대로 설정하면 됩니다.참고로 마지막 %} 은 알림의 변수를 표시할 때 펼쳐집니다.

    총결산


    나는 Zsh로 스크립트를 만들어서 Giit 창고의 상태를 보여 주려고 했다.최소한의 상태 표시라면 30줄 정도면 쓸 수 있고, 조개 각본에 익숙하지 않은 분들은 이참에 한번 해보는 게 재밌잖아요.

    참고 문헌

  • get current branch name
  • zeshrc에서 본 autoload의 뜻과 용법
  • 각주
    지트 창고에서 다른 창고를 만드는 건 좋지 않지만 용서해 주세요.↩︎

    좋은 웹페이지 즐겨찾기