티스토리 뷰

들어가며

  • 회서 업무를 하다보면 보통 커밋 컨벤션이 있기 마련인데 필자의 경우에는 JIRA 를 사용하면서 JIRA 티켓 번호를 prefix 로 불여주고 있다.
    • ex. [PROJ-9321] refactor: .....
  • 다만 매번 티켓 번호를 타이핑 하는 것에 피로감이 느껴지면서 자동으로 붙여줄 수 없을가 고민하면서 git hooks 라는 방법을 적용해보았다. 

Git Hooks

  • Git 에서 제공해주는 기능으로 다양한 상황 (commit, merge 등) 에서 트리거되는 작업에서 실행되는 동작을 정의할 수 있다.
  • 자세한 내용은 공식 문서 참고 

 

 

Git - Git Hooks

If you’re writing a script/hook that others will need to read, prefer the long versions of command-line flags; six months from now you’ll thank us.

git-scm.com


적용해보기

  • hook 을 적용하기 위해서는 원하는 hook 을 확인하고 해당 hook 파일에 쉡 스크립트 형태로 동작을 정의할 수 있다. 

현재 branch 명 추출하기

  • shell 에서 grep 명령어를 통해서 현재 브랜치 이름만 가져오는 코드이다. 
  • 이제 아래 코드를 스크립트에 적용할 것이다. 
$ git branch | grep '\*' | sed 's/\* //' | sed 's/\([^/]*\).*/\1/'
PROJ-2372

prepare-commit-msg 

  • 나의 경우 커밋을 하는 시점에 커밋 메시지를 가공하고 싶었기에 'prepare-commit-msg' 훅을 사용하게 되었다. 
  • 이제 적용을 원하는 git 프로젝트의 '.git/hooks' 디렉터리에 prepare-commit-msg  파일을 생성하고 아래 코드를 넣는다. 
#!/bin/sh  
# .git/hooks/prepare-commit-msg  
#  
# Automatically add branch name and branch description to every commit message except merge commit.  
# https://stackoverflow.com/a/18739064  
#  
  
COMMIT_MESSAGE_FILE_PATH=$1  
  
# merge commit에 대해서는 prefix를 생성하지 않는다.  
MERGE=$(grep -c -i 'merge' < "$COMMIT_MESSAGE_FILE_PATH")  
if [ "$MERGE" != "0" ] ; then  
  exit 0  
fi  
  
PREFIX=$(git branch | grep '\*' | sed 's/* //' | sed 's/^.*\///' | sed 's/^\([^-]*-[^-]*\).*/\1/')
echo "[$PREFIX] $(cat "$COMMIT_MESSAGE_FILE_PATH")" > "$COMMIT_MESSAGE_FILE_PATH"

 

 

  • 이후에 해당 파일을 실행 가능하게 권한을 준다. 
  • 그리고 커밋을 해보면 브랜치명이 '[PROJ-3124]' 형태로 prefix 로 붙는 것을 확인할 수 있다. 
$ chmod +x .git/hooks/prepare-commit-msg

참고

 

반응형
댓글