Git Hooks란?

Git hooks는 commit, push, receive와 같은 특정 이벤트 전후에 Git이 자동으로 실행하는 스크립트입니다. Git의 기본 제공 기능으로, 동작을 사용자 정의하고 워크플로에서 작업을 자동화할 수 있습니다.

Hooks는 모든 Git 저장소의 .git/hooks 디렉터리에 저장됩니다. 저장소를 초기화하면 Git은 이 디렉터리를 여러 예제 스크립트로 채웁니다.

문제 상황

프로젝트에 특정 표준을 적용하고 싶습니다. 예를 들어, 다음을 보장하고 싶습니다.

  • 모든 코드는 커밋되기 전에 린트(lint) 검사를 받습니다.
  • 커밋 메시지는 특정 형식을 따릅니다.
  • 코드를 원격 저장소에 푸시하기 전에 테스트가 실행됩니다.

이러한 작업을 수동으로 기억하는 것은 오류가 발생하기 쉽습니다. Git hooks가 이를 자동화할 수 있습니다.

해결 방법

1. Hooks 디렉터리 찾기

Git 저장소 내의 hooks 디렉터리로 이동합니다.

cd .git/hooks
ls

다음과 같은 샘플 hook 파일 목록이 표시됩니다.

  • pre-commit.sample
  • prepare-commit-msg.sample
  • commit-msg.sample
  • post-commit.sample
  • pre-push.sample

2. Hook 생성하기

hook을 활성화하려면 .git/hooks 디렉터리에 올바른 이름과 확장자가 없는 파일을 만들어야 합니다. 예를 들어, pre-commit hook을 만들려면 pre-commit이라는 파일을 만듭니다.

린터를 실행하는 간단한 pre-commit hook을 만들어 보겠습니다.

  1. 샘플 파일의 이름을 바꾸거나 복사합니다.
    cp pre-commit.sample pre-commit
    
  2. 스크립트를 실행 가능하게 만듭니다.
    chmod +x pre-commit
    
  3. 편집기에서 pre-commit 파일을 열고 스크립트를 추가합니다. 셸 스크립트이거나 Python 또는 Ruby와 같은 다른 스크립팅 언어를 사용할 수 있습니다.

다음은 스테이징된 파일에 대해 린터를 실행하는 간단한 셸 스크립트 예제입니다.

#!/bin/sh

echo "Running linter before commit..."

# 린터 명령을 실행합니다. 예를 들어, JavaScript 프로젝트의 경우:
npm run lint

# 린터가 실패하면 0이 아닌 상태로 종료되어
# 커밋이 중단됩니다.
if [ $? -ne 0 ]; then
  echo "Linting failed. Aborting commit."
  exit 1
fi

echo "Linting passed."
exit 0

이제 git commit을 실행할 때마다 이 스크립트가 실행됩니다. npm run lint 명령이 실패하면 커밋이 중단됩니다.

일반적인 Hooks

  • pre-commit: 커밋 메시지를 입력하기 전에 실행됩니다. 커밋하려는 스냅샷을 검사하는 데 사용합니다. 여기서 테스트나 린팅을 실행할 수 있습니다.
  • commit-msg: 커밋 메시지를 인수로 받습니다. 필요한 패턴에 대해 메시지를 유효성 검사하거나 정보를 자동으로 추가하는 데 사용합니다.
  • pre-push: 코드를 원격 저장소에 푸시하기 전에 실행됩니다. 손상된 코드를 푸시하지 않도록 테스트를 실행하는 데 사용합니다.

Hooks 공유하기

Git hooks는 프로젝트의 나머지 부분과 함께 복제되지 않습니다. 각 개발자의 저장소에 로컬입니다. 이는 악성 스크립트가 자동으로 실행되는 것을 방지하기 위한 보안 조치입니다.

팀과 hooks를 공유하려면 다음을 수행할 수 있습니다.

  1. 프로젝트 내의 디렉터리(예: scripts/hooks)에 hooks를 저장합니다.
  2. 이를 .git/hooks 디렉터리로 복사하거나 심볼릭 링크하는 스크립트를 만듭니다.
  3. 개발자가 저장소를 복제한 후 이 설정 스크립트를 실행하도록 합니다.

JavaScript 프로젝트용 Husky와 같은 일부 도구는 Git hooks를 더 쉽게 관리하고 공유하는 데 도움이 될 수 있습니다.

결론

Git hooks는 개발 워크플로에서 작업을 자동화하고 표준을 적용하는 강력한 메커니즘입니다. pre-commitpre-push와 같은 hooks를 사용하여 문제를 조기에 발견하고 프로젝트에서 높은 수준의 코드 품질을 유지할 수 있습니다.

Leave a comment