우선 진행하는 프로젝트에서 git hooks 설정을 다른 분이 모두 해주셨지만, 저는 잘 모르니까 뭔가 답답했습니다.
이런 답답함이 생긴 기회에 궁금함을 해소하려고 합니다.
cd .git/hooks
삽질한 과정
vim 을 통해 pre-commit 을 생성해주었습니다. 다음 내용을 넣었습니다.
echo 'Hello Gabia!'
이제 바로 될 줄 알았것만, 뭔가 추가적인 설정이 필요한 듯 했습니다.
.git/hooks 경로에 들어와서 ls 명령어를 실행하면 다음과 같은 파일들을 볼 수 있을 겁니다.
이중에서 저는 pre-commit.sample 을 건들여야합니다. (이미지에서는 pre-commit 일텐데 제가 이미 수정하고 난 후라서 그렇습니다. 혼동하지 말길 바랍니다.)
쉽게 말하자면 pre-commit.sample 파일의 이름 -> pre-commit 으로 변경하면 됩니다.
그리고 echo 'hello GABIA' 라는 한줄을 추가 해주었습니다.
짜잔 한줄이 잘 출력되는 모습입니다.
이번에는 main branch에 직접적으로 push 할 수 없도록 해봅시다.
그렇다면 pre-push.sample 파일을 수정해야합니다.
아래 코드를 붙여넣기 해주세요.
이때 주의 해야할점이 있습니다.
FORBIDDEN_HTTPS_URL , FORBIDDEN_SSH_URL 변수는 그 프로젝트의 깃허브 https , ssh url 로 하셔야합니다.
github 에서 간단하게 확인하실 수 있으실거예요!
#!/bin/sh
FORBIDDEN_HTTPS_URL="https://github.com/ehddud1006/Interactive_front.git"
FORBIDDEN_SSH_URL="git@github.com:ehddud1006/Interactive_front.git"
FORBIDDEN_REF="refs/heads/main" # insert branch ref
remote="$1"
url="$2"
if [ "$url" != "$FORBIDDEN_HTTPS_URL" -a "$url" != "$FORBIDDEN_SSH_URL" ]
then
exit 0 # Forked Project 에서는 제한하지 않음
fi
if read local_ref local_sha remote_ref remote_sha
then
if [ "$remote_ref" == "$FORBIDDEN_REF" ]
then
echo "DO NOT PUSH it main"
exit 1 # 금지된 ref 로 push 를 실행하면 에러
fi
fi
exit 0
push 를 해봤는데 block 당하는 모습입니다.
husky의 필요성
하지만 gitHooks 는 레포에 푸쉬할 수 없습니다. 즉 협업자가 모두 동일한 scripts 를 맞추기 위해서는 pre-commit 은 다음 코드로 적용해주시고, pre-push는 다음 코드를 적용해주세요. 라고 할 수 있도록 코드가 공유되어야할 것입니다.
이러한 과정은 쉽지않죠. 적용을 하지않는 팀원이 생길 수도 있습니다. 적용했는지 안했는지 일일히 확인하기 쉽지않고요.
그래서 사용할 수 있는 것이 husky 입니다. 팀원간의 Git Hooks 컨벤션을 맞추기 위해서입니다.
husky 는 Git Hooks 를 보다 쉽게 적용할 수 있는 npm 모듈입니다. 심지어 Git Hooks 에 대해 자세히 알지 못하더라도 commit, push 정책을 관리하고 공유할 수 있습니다.
1. husky 시작하기
다음 명령어를 사용하여 husky 를 설치합니다. 필자가 테스트한 버전은 v8 이였습니다!
npx husky-init && npm install
2. husky 설정하기
설치 후 Git Hook 이 실행되게끔 하기위한 스크립트라고 합니다.
// package.json
{
...,
"scripts": {
...
"prepare": "husky install"
},
...
}
저는 hello 라는 스크립트를 하나더 만들어줬습니다. 나중에 사용할 것입니다!
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prepare": "husky install",
"hello": "echo HELLO HUSKY"
},
이제 다음 명령어로 pre-commit 에 대한 설정을 해줄 수 가 있습니다.
아까 위에서 만들어놓은 hello 라는 스크립트가 commit 실행될 때 같이 실행되게 됩니다!
npx husky add .husky/pre-commit 'npm run hello'
그러고 나면 설정한 명령어가 .husky 폴더에 pre-commit 에 자동으로 작성이 되게 되는데요.
이를 없애주고 싶으면 저 코드를 지워주시면 됩니다. 보통은 commit 할때 test나 lint 검사를 넣어준다고 해요!
husky를 사용하여 main branch 에 푸쉬 안되도록 하기
그러면 아까 .git/hooks 에 직접 설정해주었던 것을 husky를 사용하여 설정하고 마무리합니다!
어휴 꽤 오랜시간 고민했습니다..
쉘스크립트
우선 쉘 스크립트라는 배경지식이 필요했습니다.
확장자 명은 sh 입니다.
test.sh 라는 쉘 스크립트 파일을 생성했습니다.
echo "In file 1: $(pwd)"
cd ..
echo "In file 2: $(pwd)"
다음 명령어를 통해 실행이 되더라구요.
sh test.sh
즉, 만약에 package.json 내부의 scripts 문이 너무 길어질 경우에 쉘 스크립트로 빼주는 것도 고려해볼 수 있겠구나! 생각이 들었습니다.
다음과 같은 scripts 문이요!
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prepare": "husky install",
"hello": "echo HELLO HUSKY",
"he": "sh test.sh"
},
자자 쉘 스크립트에 대해서 알아봤으니 본래의 목표로 돌아가봅시다.
husky 폴더 구조는 다음과 같습니다.
mainPushBlock.sh 라는 쉘 스크립트 파일을 만들어주었어요.
코드 내용은 위 main 브랜치에 푸쉬할 수 없게하는 코드와 동일합니다.
그러면 pre-push.sh 파일에 다음 코드 두줄을 추가합니다.
제가 경로를 찍어봤는데 .husky 에 change directory 해야 mainPushBlock.sh 에 접근할 수 있더라구요.
source 명령어는 쉽게말해 import 라고 생각하시면 될 것 같습니다.
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
cd .husky
source ./mainPushBlock.sh
잘 적용이 된 모습입니다.
husky에 대한 간단한 이해를 기록해봤습니다. 읽어주셔서 감사합니다.
참고자료
https://blog.pumpkin-raccoon.com/85
'공부기록 > git' 카테고리의 다른 글
git conflict rebase 로 처리하기 (0) | 2022.09.30 |
---|---|
Github 레포에서 clone 한 프로젝트 branch가 보이지 않을때 (0) | 2022.09.28 |
git 방금 commit 취소하는 방법 (0) | 2022.09.13 |
git 코드 리뷰 (0) | 2022.08.12 |
github로 리액트 어플리케이션 배포하기 (0) | 2022.08.11 |