브랜치 전환시에 대상 브랜치의 stash 목록을 표시하는 방법
5513 단어 ShellScriptgithooksZshGit
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의 표준 기능인 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
결과
※ 설명을 위해, 여기에서는 아직 문자색의 변경등은 실시하고 있지 않습니다. 색상이 지정된 버전의 코드는 다음 절을 참조하십시오.
기술 세부 사항
#!/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
옵션이 필요할까 생각합니다. 자세한 내용은 이 기사을 참조하십시오.
이상입니다. 개선점 등이 있으면 코멘트나 요청에서 가르쳐 주시면 감사하겠습니다.
Reference
이 문제에 관하여(브랜치 전환시에 대상 브랜치의 stash 목록을 표시하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/POPOPON/items/4e9cad1e1d87ae4df635
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#!/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
Reference
이 문제에 관하여(브랜치 전환시에 대상 브랜치의 stash 목록을 표시하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/POPOPON/items/4e9cad1e1d87ae4df635텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)