ougi FE

Git Hooks와 Husky란? 본문

카테고리 없음

Git Hooks와 Husky란?

ougi 2025. 2. 20. 18:14
728x90

오늘은 깃허브를 보다가 발견한 Husky에 대해서 알아보면서 기본으로 알아야 할 Git Hook까지 알아보도록 하겠습니다

Husky


Git Hooks란?

Git Hooks

Git Hooks는 Git repository에서 특정 이벤트가 발생할 때마다 자동으로 실행되는 스크립트입니다

훅은 .git/hooks 이곳에 저장됩니다 

이 디렉토리에서는 Git이 기본적으로 제공한 유용한 스크립트 예제가 몇가지 존재합니다

그리고 스크립트가 입력받는 값이 어떤 값인지 파일 안에 자세히 설명되어 있습니다

 

클라이언트 훅과 서버 훅으로 나눌 수 있습니다

클라이언트 훅

commit이나 merge를 할 때 실행됩니다

클라이언트 훅은 매우 다양해서 committing-workflow 훅, email-workflow 훅, 기타가 있는데
저는 committing-workflow 훅과 기타 훅만 설명 드리겠습니다

  • committing-workflow 훅: git commit 명령어를 통해 commit을 진행할 때 실행
    • pre-commit: 훅은 커밋할 때 가장 먼저 호출되는 훅으로 커밋 메시지를 작성하기 전에 호출 (코드 검사)
    • prepare-commit-msg: Git이 커밋 메시지를 생성하고 나서 편집기를 실행하기 전에 실행 (커밋 메시지 수정, 추가)
    • commit-msg: commit을 하기 바로 전 실행 (프로젝트 상태나 커밋 메시지를 검증)
    • post-commit: commit이 완료 된 후 실행 ( 커밋된 것을 누군가 혹은 다른 프로그램에게 알릴 때 사용)
  • 기타 훅
    • pre-rebase: Rebase 하기 전에 실행 (리베이스가 가능한지 검사, 테스트 실행)
    • post-rewrite: 커밋을 변경하는 명령을 실행했을 때 실행 git commit --amend 이나 git rebase ( 변경된 커밋 로그 저장, 알림 출력 활용)
    • post-merge: Merge가 끝나고 나서 실행 (원하는 대로 잘 배치됐는지 검사)
    • pre-push: git push 명령 실행 시 작동하고 remote 정보를 업데이트 한 후 데이터를 전송하기 전 실행, push 중단 가능

서버 훅

서버 훅은 모두 Push 전후에 실행됩니다

  • pre-receive: Push 하면 가장 처음 실행 (브랜치 보호, 코드 검사, 민감한 파일 푸시 방지)
  • update: 브랜치 별로 Push가 발생 했을 때 실행 (테스트 검증, 강제 푸시 방지, 특정 브랜치 보호)
  • post-receive: Push 한 후 실행 (푸시된 내용을 기반으로 알림, 자동 배포, 로그 저장)
git commit --amend
마지막 커밋을 수정하거나 덧붙여서 새로 커밋을 만들지 않고 기존 커밋을 덮어씁니다

git rebase
현재 브랜치를 다른 브랜치 위로 옮겨서 커밋 히스토리를 새롭게 만들 수 있습니다

 


Husky란?

Husky는 git hooks을 적용하게 도와주는 라이브러리입니다

Husky를 사용하면 git을 사용할 때 특정 스크립트를 실행시킬 수 있는 라이브러리입니다

 

사용하기

# npm
npx husky-init && npm install

# yarn
yarn add husky --dev
yarn husky install

위 명령어로 적용하면 .husky 디렉토리가 생깁니다 그 안에 hook 스크립트를 추가하면 됩니다

 

예시

ESLint + lint-staged + Husky 조합

/.husky
    └─ .gitignore
    └─ husky.sh
    └─ 내가 추가할 script... 
    └─ pre-commit # 예시

 

# ./husky/pre-commit

/.husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

 

lint-staged
staged 상태에 놓인 파일을 검사하여 lint를 통과하지 못한 파일은 commit failed 처리 시키는 라이브러리

글을 마치며 

오늘은 Git Hooks와 Husky에 대해서 알아보았는데

이것들을 이용하면 협업을 훨씬 더 체계적으로 하게 될 수 있을거 같아서 좋았습니다

글을 읽어주셔서 감사합니다

728x90