Git Hook과 pre-commit 패키지

ja_efan·2025년 1월 12일
0

git

목록 보기
1/1
post-thumbnail

Git Hook


Git Hook은 Git에서 제공하는 사용자 정의 스크립트로,
특정 Git 이벤트가 발생할 때 자동으로 실행되도록 설정할 수 있다.
이를 통해 Git 워크플로를 자동화하고 품질 관리, 작업 표준화 등을 실현할 수 있다.

git hook을 사용하기 위한 전체적인 플로우는 다음과 같다.

  1. Git Hook의 사용 목적 결정
    1. 커밋 메시지 형식 검증 ✅
    2. 코드 포맷팅 검사
    3. 테스트 실행
    4. 린트 검사
    5. etc.
  2. Git Hook의 종류 선택
    1. pre-commit: git commit 전에 실행
    2. commit-msg: 커밋 메시지 검증 ✅
    3. pre-push: git push 전에 실행
    4. pre-rebase: rebase 전에 실행
    5. etc.
  3. Hook 스크립트 작성
    1. 프로젝트 디렉토리에 Hook 스크립트를 작성 ✅
    2. Python, Bash, Node.js 등을 사용
  4. Git Hook 설정 파일 구성
    기본적으로 Git Hook은 ./git/hooks 디렉토리에 저장
    1. 스크립트를 ./git/hoooks 디렉토리에 직접 배치
    2. pre-commit 라이브러리를 사용해 쉽게 관리 ✅

pre-commit 패키지


해당 리포지토리에서는 pre-commit을 사용하여 커밋 메시지 검증을 목적으로 한다.

  1. 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 파일은 아래 플로우에 따라 자연스럽게 생성하게 된다.
  2. pre-commit 설치

    pip install pre-commit
  3. 프로젝트 루트에 .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]
  4. 프로젝트 루트에 scripts 디렉토리 생성

    bash mkdir scripts
  5. 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: 프로젝트 의존성 업데이트
  6. Git Hook 활성화

    pre-commit install --hook-type commit-msg
  7. 테스트 및 디버깅

    • 의도한 Hook이 제대로 동작하는지 테스트
      # 지정한 패턴에 맞지 않는 메시지 
      git commit -m "내 마음대로 커밋 메시지 작성" 
      
      # ❌ 커밋 메시지가 컨벤션에 맞지 않습니다.
      # 예시: [feat] 사용자 로그인 기능 추가 #PROJ-123"
      
      # 지정한 패턴에 맞는 메시지
      git commit -m "[docs] README.md 파일 수정 (사용 방법 작성) #githook-02"
      
      # passed 
    • 필요하면 로그 출력 등을 추가해 디버깅
  8. 팀과 공유 (optional)

    • .pre-commit-config.yaml과 관련 스크팁트를 저장소에 포함해 팀원에게 공윻
    • 추가적으로 팀원들에게 pre-commit 설치 및 활성화 방법을 안내
profile
이것저것.

0개의 댓글

관련 채용 정보