Git Hook은 Git에서 제공하는 사용자 정의 스크립트로,
특정 Git 이벤트가 발생할 때 자동으로 실행되도록 설정할 수 있다.
이를 통해 Git 워크플로를 자동화하고 품질 관리, 작업 표준화 등을 실현할 수 있다.
git hook을 사용하기 위한 전체적인 플로우는 다음과 같다.
pre-commit
라이브러리를 사용해 쉽게 관리 ✅해당 리포지토리에서는 pre-commit
을 사용하여 커밋 메시지 검증을 목적으로 한다.
pre-commit
을 사용하는 경우 프로젝트 디렉토리 구조
project
├── .git
│ └── hooks
│ └── commit-msg.sample
│ └── pre-commit.sample
│ └── pre-push.sample
│ └── pre-rebase.sample
│
├── .pre-commit-config.yaml
│
├── scripts
│ └── commit-msg-check.py
│ └── ...
└── ...
pre-commit
라이브러리를 사용할 경우 .git/hooks
디렉토리는 따로 건드리지 않아도 되며,scripts
디렉토리와 .pre-commit-config.yaml
파일은 아래 플로우에 따라 자연스럽게 생성하게 된다.pre-commit 설치
pip install pre-commit
프로젝트 루트에 .pre-commit-config.yaml
파일 작성
repos:
- repo: local
hooks:
- id: commit-msg-check
name: Commit Message Check
entry: python3 scripts/commit-msg-check.py
language: system
stages: [commit-msg]
프로젝트 루트에 scripts
디렉토리 생성
bash mkdir scripts
scripts/commit-msg-check.py
파일 작성
#!/usr/bin/env python3
import re
import sys
# Git이 전달한 커밋 메시지 파일 경로 읽기
commit_msg_filepath = sys.argv[1]
# 커밋 메시지 파일의 내용을 읽음
with open(commit_msg_filepath, 'r') as file:
commit_msg = file.read().strip()
print(f"검사할 커밋 메시지: {commit_msg}")
# 커밋 메시지 패턴 정의
pattern = r"^\[(feat|fix|docs|style|refactor|test|chore)\] .+ #[a-zA-Z0-9]+-[0-9]+$"
# 정규식 검증
if not re.match(pattern, commit_msg):
print("❌ 커밋 메시지가 컨벤션에 맞지 않습니다.")
print("예시: [feat] 사용자 로그인 기능 추가 #PROJ-123")
sys.exit(1)
print("✅ 커밋 메시지가 컨벤션에 맞습니다.")
Type | 의미 | 예시 |
---|---|---|
feat | 새로운 기능 추가 | feat: 사용자 프로필 기능 추가 |
fix | 버그 수정 | fix: 로그인 로직 버그 수정 |
docs | 문서 수정 | docs: README.md 업데이트 |
style | 코드 스타일 변경 (기능에 영향 없음) | style: 파일 인덴트 정리 |
refactor | 코드 리팩토링 (기능 변화 없음) | refactor: 불필요한 변수 제거 |
test | 테스트 코드 추가, 수정 | test: API 테스트 추가 |
chore | 기타 작업 (설정 파일, 빌드 스크립트 등) | chore: 프로젝트 의존성 업데이트 |
Git Hook 활성화
pre-commit install --hook-type commit-msg
테스트 및 디버깅
# 지정한 패턴에 맞지 않는 메시지
git commit -m "내 마음대로 커밋 메시지 작성"
# ❌ 커밋 메시지가 컨벤션에 맞지 않습니다.
# 예시: [feat] 사용자 로그인 기능 추가 #PROJ-123"
# 지정한 패턴에 맞는 메시지
git commit -m "[docs] README.md 파일 수정 (사용 방법 작성) #githook-02"
# passed
팀과 공유 (optional)
.pre-commit-config.yaml
과 관련 스크팁트를 저장소에 포함해 팀원에게 공윻