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

(GIT Repository - Setting 설정에서 찾아 봅시다!)
🎩 GIT - Hook & Husky 설정
🪤 Hook 사용하기
- .git 폴더 안의 hooks 폴더로 갑니다.

- 여기서 사용할 것은
prepare-commit-msg
입니다. - 확장자인
.sample
를 제거합니다. - 내용을 작성!!
#!/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
- 끗.
😎 Husky 설정
- npm 초기화 & husky 설치
# npm 초기화 & package.json 생성 npm init

↖ npm 초기화 하게 되면 package.json이 파일이 생성됩니다.
(초기화 시, 설정 입력란이 나오는데 전부 Enter로 넘어가도 됩니다!)
# husky 다운로드 npx husky-init && npm install
↖ 명령어 실행 시, husky가 다운로드 진행되고…

↖ 다운로드가 완료되면,
.husky
를 디렉토리가 생성됩니다.
그와 함께
package.json
에 변경사항이 있다면, package-lock.json
도 함께 생기게 됩니다.
(이미 변경이력이 있다면 package-lock.json
은 이미 존재할 것입니다. )그럼 이제
package.json
를 수정해볼까요?{ "scripts": { "prepare": "husky install" }, "devDependencies": { "husky": "^8.0.1" } }
위와 같이 변경 한다면 깔끔 하겠죠? 😁
(
package-lock.json
가 의존성 정보를 모두 가지고 있으므로, 필요 구문 외에 삭제해도 무방)prepare-commit-msg
파일 생성
# hook 파일 생성 vi .husky/prepare-commit-msg
그리고 내용은 아래와 같이 작성해주세요.
(
PREFIX_LIST
, BRANCHES_TO_SKIP
등은 보시고 수정해주셔야 됩니다!)#!/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
- 끗.
🐶 이제 잘 작동되는지 확인해볼까요?
- 잘못된 형식의 커밋 메시지 사용 시


- 올바른 커밋 메시지 사용 시, 커밋 성공!

🔖 참고 사이트
- Hook & Husky