개발환경 구축

Git prepare-commit-msg 를 통한 commit convention 정착시키기

뒷골목프로그래머 2023. 4. 26. 11:13
반응형

안녕하세요. 글쓰는 개발자 입니다.

 

 prepare-commit-msg 파일을 생성하여, git commit message convention을 정하고, 이를 준수했을 때만 commit이 가능하게 하는 법을 소개합니다.

 Commit message의 허용되는 Prefix를 정하고 commit 수행 시 message를 검증하고 Convention을 준수하지 않는 경우, 안내 메시지를 출력하는 방법 입니다.

 

 적용 순서는 다음과 같습니다.

  1. .git/hooks 확인, prepare-commit-msg 생성 및 권한 부여
  2. .git/hooks/prepare-commit-msg 작성
  3. commit 수행

------------------------------------------ 2023. 05. 04 추가 --------------------------------------------

- Windows Cmd에서 prepare-commit-msg 생성 추가

 

.git/hooks 확인, prepare-commit-msg 생성 및 권한 부여

 Git 공식문서에 따르면 Git Hooks의 제목은 Customizing Git - Git Hooks 입니다. hook을 잘 활용하면, Git을 customizing 할 수 있고, 그 중 commit 전/후 작업 또한 정의 할 수 있습니다. 원격 Git Repository를 Clone 했거나 직접 git init 명령어를 사용했다면, .git 디렉토리가 생성되어 있을 것 입니다. 아래와 같이 이동하여 목록을 살펴보면 여러 작업을 정의 할 수 있음을 파일 이름만 봐도 알 수 있습니다. 이 파일 중 prepare-commit-msg.sample 을 참고하여, prepare-commit-msg 를 생성하겠습니다. 

 

Mac / Linux

# Repository Root에서 시작
cd .git/hooks && touch prepare-commit-msg && ll -a
drwxr-xr-x 16 kobe staff 512B Apr 26 10:37 .
drwxr-xr-x 15 kobe staff 480B Apr 26 10:00 ..
-rwxr-xr-x 1 kobe staff 478B Apr 25 14:54 applypatch-msg.sample
-rwxr-xr-x 1 kobe staff 896B Apr 25 14:54 commit-msg.sample
-rwxr-xr-x 1 kobe staff 4.5K Apr 25 14:54 fsmonitor-watchman.sample
-rwxr-xr-x 1 kobe staff 189B Apr 25 14:54 post-update.sample
-rwxr-xr-x 1 kobe staff 424B Apr 25 14:54 pre-applypatch.sample
-rwxr-xr-x 1 kobe staff 1.6K Apr 25 14:54 pre-commit.sample
-rwxr-xr-x 1 kobe staff 416B Apr 25 14:54 pre-merge-commit.sample
-rwxr-xr-x 1 kobe staff 1.3K Apr 25 14:54 pre-push.sample
-rwxr-xr-x 1 kobe staff 4.8K Apr 25 14:54 pre-rebase.sample
-rwxr-xr-x 1 kobe staff 544B Apr 25 14:54 pre-receive.sample
-rw-r--r-- 1 kobe staff 0B Apr 26 10:37 prepare-commit-msg
-rwxr-xr-x 1 kobe staff 1.5K Apr 25 14:54 prepare-commit-msg.sample
-rwxr-xr-x 1 kobe staff 2.7K Apr 25 14:54 push-to-checkout.sample
-rwxr-xr-x 1 kobe staff 3.6K Apr 25 14:54 update.sample

 위의 .git/hooks 하위 파일 목록을 잘 보시면, 방금 생성한 prepare-commit-msg 파일의 권한이  -rw-r--r-- 로 설정되어 있습니다. 따라서, 아래와 같이 실행 권한인 x 를 부여해 정상 동작 할 수 있도록 합니다.

# 실행 권한 부여
chmod +x prepare-commit-msg
# 실행 권한 확인
ll -a | grep "prepare-commit-msg"
# 결과
-rwxr-xr-x 1 kobe staff 0B Apr 26 10:37 prepare-commit-msg
-rwxr-xr-x 1 kobe staff 1.5K Apr 25 14:54 prepare-commit-msg.sample

Windows (2023.05.04 추가)

 사내 windows PC 사용 개발자 덕분에 추가되었습니다. 아래 명령어를 통해 prepare-commit-msg 파일을 생성하고 메모장을 열어 script를 복사하고 저장합니다.

# prepare-commit-msg 파일 생성
cd .git\hooks\ && fsutil file createnew prepare-commit-msg 0
# 메모장 열기, 아래 스크립트 복사/붙여넣기 -> 저장
notepad prepare-commit-msg

 

.git/hooks/prepare-commit-msg 작성

 파일 내용은 아래와 같습니다. 사용자의 git commit -m "Message" 명령어 중 Message를 가져와 이를 정규식으로 검증하고 만족못할 시 commit을 제한 하는 것입니다.

#!/bin/bash
MESSAGE=$(cat $1)
COMMITFORMAT="(Feat|Fix|Docs|Style|Refactor|Design|Comment|Rename|Remove|Teest|!HOTFIX|!BREAKING CHANGE): (.*)"
if ! [[ "$MESSAGE" =~ $COMMITFORMAT ]]; then
echo ""
echo " Commit Message 포맷을 아래 예시와 같이 지켜주세요."
echo " 사용가능한 commit의 Prefix는 아래와 같습니다."
echo ""
echo "======================= 반드시 콜론(:) 을 붙여야 합니다. ========================="
echo ""
echo " Feat: 새로운 기능을 추가"
echo " Fix: 버그 수정"
echo " Design: CSS 등 사용자 UI 디자인 변경"
echo " !BREAKING CHANGE: 커다란 API 변경의 경우"
echo " !HOTFIX: 급하게 치명적인 버그를 고쳐야하는 경우"
echo " Style: 코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우"
echo " Refactor: 코드 리팩토링"
echo " Comment: 필요한 주석 추가 및 변경"
echo " Docs: 문서 수정"
echo " Test: 빌드 업무 수정, 패키지 매니저 수정, 패키지 관리자 구성 등 업데이트, Production Code 변경 없음"
echo " Rename: 파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우"
echo " Remove: 파일을 삭제하는 작업만 수행한 경우"
echo ""
echo "=================================================================================="
echo ""
echo -e " 아래 EXAMPLE과 같이 첫째 줄에 Prefix와 함께 요약을 남기고 한 줄 개행 후 상세 내용을 작성해주세요. \n Merge Request 시 Overview에 자동으로 Title, Description 작성이 완료됩니다."
echo ""
echo "================================== E X A M P L E ================================="
echo ""
echo -e " git commit -m \"Feat: 기능 A 추가\n\n 1. 000파일 추가 \n 2. 2222파일추가\n 3. 00 관련 비즈니스 로직 추가\""
echo ""
echo "=================================================================================="
echo ""
exit 1
fi

 

commit 수행

 아래와 같이 commit을 수행 합니다. 잘못된 경우로 입력시 아래 그림과 같이 안내 문구가 제대로 표시 됨을 확인 하실수 있습니다.

# 지키지 않은 경우 1 (Prefix 없음)
git commit -m "기능 추가"
# 지키지 않은 경우 2 (Prefix 뒤 콜론(:) 없음)
git commit -m "Feat 기능추가추가"
# 올바른 경우
git commit -m "Feat: A 기능 추가
1. #0000 반영
2. 000 비즈니스 로직 추가
"

 

참고

https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

 

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

https://dev.to/anibalardid/how-to-check-commit-message-and-branch-name-with-git-hooks-without-any-new-installation-n34

 

How to check commit message and branch name with git hooks without any new installation

Introduction Hi All ! I'm a tech lead, and I'm on charge to check Pull Request/Merge...

dev.to

 

반응형