브랜치 전환시에 대상 브랜치의 stash 목록을 표시하는 방법

stash한 것을 잊어버리는 문제


git stash 는 매우 편리하지만, 다른 브랜치에서 작업하는 동안 stash한 것을 잊고 돌아왔을 때 다시 같은 작업을 시작해 버리는 일이 가끔 있습니다.

이번에는 그 대책으로서,
"브랜치를 이동할 때마다 대상 브랜치의 stash 목록을 표시하는 Git 후크"
작성했으므로 구현 방법을 설명합니다.

완성 이미지



다음과 같이 대상 브랜치에서 stash한 것만 표시하는 이미지입니다(다른 브랜치의 것은 표시하지 않음).

이것이라면 분명히 평소와 다르기 때문에 stash 의 존재를 기억할 수 있을 것입니다.

또, 원래 존재하는 기능(git hooks) 밖에 사용하지 않기 때문에, 이상한 플러그인을 넣거나 할 필요도 없습니다.

실현 방법



git의 표준 기능인 git hooks를 사용합니다.

git hooks란 .git/hooks/ 아래에 놓인 스크립트군으로, 특정 타이밍에 자동으로 호출되는 구조로 되어 있는 것입니다.

예를 들면 「commit 전에 린트를 하고 싶다」라고 하는 경우에는 pre-commit 라는 이름의 파일을 .git/hooks/ 에 배치해, 린트를 실시하는 코드를 쓰면 OK라고 하는 느낌입니다.

이번은 git switch 이나 git checkout 의 뒤에 불려 주었으면 하므로 post-checkout 라는 이름으로 작성합니다.

구현



처리의 흐름을 대략적으로 말하면,
1. git branch --show-current 로 이동 후의 브랜치명을 취득해,
2. 그 브랜치명을 git stash list 중에서 grep 한다
라는 느낌입니다.

.git/hooks/post-checkout
#!/bin/sh

has_branch_changed=$3 #ブランチ移動したかどうかのフラグ
current_branch=$(git branch --show-current | awk -F/ '{print $NF}')

if [ $has_branch_changed = 1 ] && [ -n "$current_branch" ]; then
  git stash list | grep "$current_branch: "
fi

결과

※ 설명을 위해, 여기에서는 아직 문자색의 변경등은 실시하고 있지 않습니다. 색상이 지정된 버전의 코드는 다음 절을 참조하십시오.

기술 세부 사항
  • git checkout 하지만 브랜치가 바뀌지 않은 경우도 있으므로, post-checkout 의 세 번째 인수 $3 (브랜치 이동했는지의 플래그)를 사용해 체크를 넣고 있습니다. 덧붙여서 $1 에는 이동원의 commit hash, $2 에는 이동처의 commit hash가 들어가 있습니다.
  • awk -F/ '{print $NF}' 는 브랜치명을 / 로 분할해 말미 부분을 취득하는 코드입니다. 이 처리가 필요한 것은, 브랜치명이 / 그리고 단락지어지고 있는 경우 git stash list (은)는 단락의 말미의 부분 밖에 표시하지 않기 때문입니다. 예를 들어, aaa/bbb/ccc 라면 ccc 의 부분 밖에 표시하지 않기 때문에, 단순히 grep <ブランチ名> 에서는 취득할 수 없습니다.
  • [ -n "$current_branch" ] 로 브랜치명이 1문자 이상인가의 체크를 실시하고 있습니다만, 이것은 detached HEAD 의 경우 브랜치명이 출력되지 않고, 결과적으로 모든 stash 가 표시되어 버리기 때문입니다.

  • 더 눈에 띄게



    상기의 코드에서는 문자색의 변경등은 실시하고 있지 않았습니다.
    그러나 보다 시인성을 높이기 위해서는 echo 를 통해서 문자색을 변경하는 편이 좋을지도 모릅니다.

    .git/hooks/post-checkout
    #!/bin/sh
    
    has_branch_changed=$3 #ブランチ移動したかどうかのフラグ
    current_branch=$(git branch --show-current | awk -F/ '{print $NF}')
    
    if [ $has_branch_changed = 1 ] && [ -n "$current_branch" ]; then
      git stash list | grep "$current_branch: " | while read line; do
        echo "🐿   \033[32m$line\033[m"
      done
    fi 
    

    결과

    전절의 코드 출력을 while read 로 돌려 , echo 로 색과 이모티콘을 부가하고 있을 뿐입니다.

    echo 의 문자색의 변경법은 쉘에 따라서 다릅니다. 예를 들어 bash 의 경우는 -e 옵션이 필요할까 생각합니다. 자세한 내용은 이 기사을 참조하십시오.

    이상입니다. 개선점 등이 있으면 코멘트나 요청에서 가르쳐 주시면 감사하겠습니다.

    좋은 웹페이지 즐겨찾기