포스트

개발 생산성을 높이는 git hooks와 husky

개발 생산성을 높이는 git hooks와 husky

git hook이란

git hook은 git에서 특정 이벤트가 발생했을 때 자동으로 특정 스크립트를 실행할 수 있도록 해주는 기능이다.

git hook은 git init 을 진행하면 생성되는 .git디렉토리 하위의 hooks디렉토리에 저장된다. 실제로 확인해보면 이미 .git/hooks 디렉토리에는 샘플훅들이 등록되어있다.

git hook의 종류

훅은 크게 클라이언트 훅과 서버훅으로 나뉘는데 그 중 내가 사용하고자 하는 것은 클라이언트 훅 그중에서도 커밋과 관련된 훅으로 pre-commit , prepare-commit-msg, commit-msg, post-commit 이렇게 네가지가 있다. 순서대로 설명하자면

pre-commit : 커밋할 때 가장 먼저 호출되는 훅으로 커밋 메시지를 작성하기 전에 호출된다. 커밋할 때 반드시 지켜야할 사항을 이 훅으로 검사한다. prepare-commit-msg : git이 커밋메시지를 생성하고 나서 편집기를 실행하기 전에 실행된다. 일반 커밋보다는 커밋 메시지를 자동으로 생성하는 경우에 유용하다. commit-msg : 커밋 메시지가 들어있는 임시 파일의 경로를 받아 최종 커밋 상태를 반환하는 스크립트를 실행한다. 이 훅이 0이 아닌 값을 반환하면 커밋되지 않는다. post-commit : 커밋이 완료될 때 실행되는 훅이다. 일반적으로 커밋을 다른 프로그램에게 알릴 때 사용된다.

그 외에도 pre-push(git push 명령 실행 시 동작하며 remote 정보를 업데이트 하고 난후 remote로 데이터를 전송하기 전에 동작), pre-rebase, post-merge 훅들과 서버 훅들이 존재한다.

git hook 생성하기

우선 테스트를 위해 pre-commit 훅을 등록하여 커밋 시 스크립트를 실행되도록 설정해보았다. .git/hooks 디렉토리에 pre-commit파일을 생성한다. 이미 .sample확장자의 파일이 존재하지만 sample 확장자의 파일을 실행되지 않는다.

pre-commit 파일은 간단하게 echo을 사용하여 문자열을 출력하게 하였다.

파일 생성을 완료하였다면,chmod 명령어를 이용하여 파일 실행권한을 부여한다.

이제 commit을 시도하면 등록한 문자열이 잘 출력되는 것을 확인 할 수 있었다. pre-commit 훅은 exit코드가 0이 아닌 경우 commit이 취소되기 때문에 실제로 commit은 진행되지 않은것 까지 확인할 수 있다!

husky

위에서 설명한 git hook은 매우 유용하지만 설정하기 번거롭고 이그노어되어있는 파일들을 프로젝트로 관리하기도 상당히 까다롭다. 이러한 git hook의 설정을 도와주는 npm 패키지가 바로 husky이다.

husky는 git hook설정을 도와주며 프로젝트 단위로 git hook을 편리하게 관리하도록 지원한다.

husky 설정하기

husky 설정방식은 매우 간단하다.npm install --save-dev husky 로 허스키를 설치 후 husky init 명령어로 프로젝트에 husky를 설정한다. husky init 을 실행하면 package.json에 prepare 스크립트가 추가되며 초기설정으로 pre-commit 스크립트 파일이 생성된다.

prepare : 패키지가 패킹되기 전, 즉 npm 게시 및 npm 패킹 중 혹은 로컬 npm install 실행시 실행되는 스크립트.

lint 설정 추가하기

husky설정이 다 되었다면 실제로 사용할 훅을 등록해볼 차례다. commit시 자동으로 린트 검사를 실행하기 위해 package.json내 스크립트에 lint 스크립트를 추가한 후 pre-commit 파일에 린트 명령어를 추가하였다.

새로운 훅을 등록할 때 아래 명령어를 실행하면 간편하게 훅 등록이 가능하다.
echo "npm run lint" > .husky/pre-commit

이제 다시 commit을 시도하면 lint명령어가 실행되며 잘못된 코드들이 있는 경우 오류가 발생하며 commit이 진행되지 않음을 확인할 수 있다.

정리하며

husky와 git hook을 설정하며 생각보다 간단한 설정에 놀랐고 좋은 툴을 미리 활용하지 못한점에 아쉬움이 남았다.
git hook과 husky을 잘 활용한다면 팀원들과 유용한 훅들을 등록하고 공유하며 자유롭게 설정할 수 있어 유용할것이라 생각이 든다.

참고

Git Hooks
git hooks 설정으로 팀 효율 높이기
husky

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.