정지용
기술스택 목록
DevOps

Git Hooks

프로젝트 2에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

커밋·푸시 같은 Git 이벤트 시점에 스크립트를 자동 실행해 검증과 규칙을 강제하는 메커니즘

Git Hooks는 커밋, 푸시, 머지 등 Git 저장소의 특정 이벤트가 발생할 때 자동으로 실행되도록 등록해 둔 스크립트다. 원래 Git 자체에 내장된 기능으로, 팀원마다 수동으로 실행하던 검증·정리 작업을 개발자가 매번 기억하지 않아도 강제로 수행되게 만들기 위해 고안됐다. 커밋 메시지 형식 검사, 코드 포맷팅, 린트, 테스트 실행 같은 작업을 사람이 잊어버려도 놓치지 않게 하는 것이 핵심 목적이다.

이럴 때 사용합니다

  • 커밋 전에 린트·포맷 검사를 강제해 잘못된 코드가 저장소에 들어가는 것을 막고 싶을 때
  • 커밋 메시지 형식이나 컨벤션을 팀 전체에 일관되게 적용하고 싶을 때
  • 푸시 전 테스트 실행 등 자동 검증 단계를 CI 이전 단계에 두고 싶을 때

핵심 개념

pre-commit
커밋이 실제로 생성되기 직전에 실행되는 훅으로, 린트나 포맷 검사에 흔히 쓰인다.
commit-msg
작성된 커밋 메시지를 검사·수정할 수 있는 훅으로, 커밋 메시지 규칙을 강제할 때 사용한다.
pre-push
원격 저장소로 푸시하기 직전에 실행되어 테스트 실행이나 브랜치 보호 같은 검증에 활용된다.
client-side vs server-side hooks
개발자 로컬에서 실행되는 훅과 서버(원격 저장소)에서 실행되는 훅으로 구분되며, 각각 실행 시점과 우회 가능 여부가 다르다.
hook manager
Git 훅은 기본적으로 .git/hooks에 저장되어 저장소를 클론해도 공유되지 않는데, 이를 팀 전체에 공유·버전 관리하기 위해 사용하는 도구 계층이다.

기본 pre-commit 훅 예시

커밋 시도 시 스테이징된 자바스크립트 파일에 대해 린트를 실행하고, 오류가 있으면 커밋 자체를 막는다.

Shell
#!/bin/sh
# .git/hooks/pre-commit

# 스테이징된 파일에 대해 린트 실행
npx eslint --max-warnings=0 $(git diff --cached --name-only --diff-filter=ACM -- '*.js')

# 린트가 실패하면 커밋 중단
if [ $? -ne 0 ]; then
  echo "린트 오류로 커밋이 취소되었습니다."
  exit 1
fi

처음 쓸 때 흔한 함정

  • .git/hooks는 클론 시 공유되지 않아 팀원마다 별도로 설치·설정해야 한다는 점을 놓치기 쉽다
  • --no-verify 옵션 등으로 훅을 쉽게 우회할 수 있어 최종 검증 수단으로만 의존하면 안 된다
  • 훅 실행 시간이 길어지면 커밋·푸시가 느려져 개발자가 습관적으로 우회하게 될 수 있다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.