HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
SFAM 포트폴리오
SFAM 포트폴리오
/
🚥
GIT - Husky 가이드
🚥

GIT - Husky 가이드

⚙️  GIT - 기본 설정🎩  GIT - Hook & Husky 설정🪤 Hook 사용하기😎 Husky 설정🔖  참고 사이트

⚙️  GIT - 기본 설정

  • Merge 된 브랜치 자동 삭제
    • 브랜치 생성 → 작업 → PR → Merge 후에 브랜치를 수동적으로 삭제해줘야 되는 번거로움이 있습니다. 이는 GIT에서 Merge된 브랜치를 자동적으로 삭제해주는 기능을 통해서 개선할 수 있었습니다. (계속해서 깜빡하는 불필요한 브랜치 삭제… 😓)
      notion image
      (GIT Repository - Setting 설정에서 찾아 봅시다!)

🎩  GIT - Hook & Husky 설정

🪤 Hook 사용하기

  • .git 폴더 안의 hooks 폴더로 갑니다.
    • notion image
  • 여기서 사용할 것은 prepare-commit-msg 입니다.
    • 확장자인 .sample 를 제거합니다.
    • 내용을 작성!!
  • ⁉️ 파일 권한 설정을 잊으면 안됩니다!! (권한 설정이 없으면 작동하지 않음.)
  • 끗.

😎 Husky 설정

  • npm 초기화 & husky 설치
    • notion image
      ↖ npm 초기화 하게 되면 package.json이 파일이 생성됩니다. (초기화 시, 설정 입력란이 나오는데 전부 Enter로 넘어가도 됩니다!)
       
      ↖ 명령어 실행 시, husky가 다운로드 진행되고…
      notion image
      ↖ 다운로드가 완료되면, .husky를 디렉토리가 생성됩니다.
       
      notion image
      그와 함께 package.json에 변경사항이 있다면, package-lock.json도 함께 생기게 됩니다. (이미 변경이력이 있다면 package-lock.json은 이미 존재할 것입니다. )
       
      그럼 이제 package.json를 수정해볼까요?
      위와 같이 변경 한다면 깔끔 하겠죠? 😁 (package-lock.json가 의존성 정보를 모두 가지고 있으므로, 필요 구문 외에 삭제해도 무방)
       
  • prepare-commit-msg 파일 생성
    • 그리고 내용은 아래와 같이 작성해주세요. (PREFIX_LIST, BRANCHES_TO_SKIP 등은 보시고 수정해주셔야 됩니다!)
  • ⁉️ 파일 권한 설정을 잊으면 안됩니다!! (권한 설정이 없으면 작동하지 않음.)
  • 끗.
 
🐶  이제 잘 작동되는지 확인해볼까요?
  • 잘못된 형식의 커밋 메시지 사용 시
    • notion image
      notion image
  • 올바른 커밋 메시지 사용 시, 커밋 성공!
    • notion image
 
 

🔖  참고 사이트

  • Hook & Husky
#!/bin/bash Font_RED='\033[91m' Font_CLEAR='\033[0m' # No Color PREFIX_LIST=( feat refactor fix style setting test docs ) if [ -z "$BRANCHES_TO_SKIP" ]; then BRANCHES_TO_SKIP=("main" "develop") fi BRANCH_NAME=$(git symbolic-ref --short HEAD) BRANCH_NAME="${BRANCH_NAME##*/}" JIRA_ID=`echo $BRANCH_NAME | egrep -o '^\w.-[0-9]+'` JIRA_ID=`echo $JIRA_ID | tr '[:lower:]' '[:upper:]'` COMMIT_MESSAGE="$(cat $1)" PREFIX=`echo $COMMIT_MESSAGE | cut -d ':' -f1 | sed 's/ *$//g'` MESSAGE=`echo $COMMIT_MESSAGE | cut -d ':' -f2` BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$") BRANCH_IN_COMMIT=$(grep -c "$JIRA_ID" $1) TICKET=[$(git rev-parse --abbrev-ref HEAD | grep -Eo '^(\w+/)?(\w+[-_ ])?[0-9]+' | grep -Eo '(\w+[-])?[0-9]+' | tr "[:lower:]" "[:upper:]")] COMMIT_SOURCE=$2 if [[ $BRANCH_EXCLUDED -eq 1 || "$COMMIT_MESSAGE" == "$TICKET"* || "${COMMIT_SOURCE}" = merge ]];then exit 0; fi if ! [[ "$COMMIT_MESSAGE" =~ ":" ]];then printf "${Font_RED}Prefix 구분을 위해 : (세미콜론)이 필요합니다.${Font_CLEAR}\n" exit 1 fi if !(printf '%s\n' "${PREFIX_LIST[@]}" | grep -xq $PREFIX); then printf "${Font_RED}[${PREFIX}] 는 존재 하지 않는 Prefix 입니다.${Font_CLEAR}\n" echo "사용가능한 Prefix 목록" printf '%s\n' "${PREFIX_LIST[@]}" exit 1 fi if [ -n $JIRA_ID ] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then echo "[$JIRA_ID] $PREFIX: $MESSAGE" > $1 fi
chmod +x .husky/prepare-commit-msg
# npm 초기화 & package.json 생성 npm init
# husky 다운로드 npx husky-init && npm install
{ "scripts": { "prepare": "husky install" }, "devDependencies": { "husky": "^8.0.1" } }
# hook 파일 생성 vi .husky/prepare-commit-msg
#!/bin/bash Font_RED='\033[91m' Font_CLEAR='\033[0m' # No Color PREFIX_LIST=( feat refactor fix style setting test docs ) if [ -z "$BRANCHES_TO_SKIP" ]; then BRANCHES_TO_SKIP=("main" "develop") fi BRANCH_NAME=$(git symbolic-ref --short HEAD) BRANCH_NAME="${BRANCH_NAME##*/}" JIRA_ID=`echo $BRANCH_NAME | egrep -o '^\w.-[0-9]+'` JIRA_ID=`echo $JIRA_ID | tr '[:lower:]' '[:upper:]'` COMMIT_MESSAGE="$(cat $1)" PREFIX=`echo $COMMIT_MESSAGE | cut -d ':' -f1 | sed 's/ *$//g'` MESSAGE=`echo $COMMIT_MESSAGE | cut -d ':' -f2` BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$") BRANCH_IN_COMMIT=$(grep -c "$JIRA_ID" $1) TICKET=[$(git rev-parse --abbrev-ref HEAD | grep -Eo '^(\w+/)?(\w+[-_ ])?[0-9]+' | grep -Eo '(\w+[-])?[0-9]+' | tr "[:lower:]" "[:upper:]")] COMMIT_SOURCE=$2 if [[ $BRANCH_EXCLUDED -eq 1 || "$COMMIT_MESSAGE" == "$TICKET"* || "${COMMIT_SOURCE}" = merge ]];then exit 0; fi if ! [[ "$COMMIT_MESSAGE" =~ ":" ]];then printf "${Font_RED}Prefix 구분을 위해 : (세미콜론)이 필요합니다.${Font_CLEAR}\n" exit 1 fi if !(printf '%s\n' "${PREFIX_LIST[@]}" | grep -xq $PREFIX); then printf "${Font_RED}[${PREFIX}] 는 존재 하지 않는 Prefix 입니다.${Font_CLEAR}\n" echo "사용가능한 Prefix 목록" printf '%s\n' "${PREFIX_LIST[@]}" exit 1 fi if [ -n $JIRA_ID ] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then echo "[$JIRA_ID] $PREFIX: $MESSAGE" > $1 fi
chmod +x .husky/prepare-commit-msg