Git Hooks
GIt 훅은 Git 레포지토리에서 특정 이벤트가 발생할 때마다 자동으로 실행되는 스크립트입니다. Git 훅을 사용하여 Git의 내부 동작을 사용자 지정하고 개발 수명 주기의 주요 시점에서 사용자 지정 가능한 작업을 트리거할 수 있습니다.
Git Hooks는 클라이언트 훅과 서버 훅으로 나눌 수 있습니다. 클라이언트 훅은 commit이나 merge 할 때 실행되고 서버 훅은 push 할 때 서버에서 실행됩니다.
hooks | 설명 | |
Client-side | pre-commit | commit 을 실행하기 전에 실행 |
prepare-commit-msg | commit 메시지를 생성하고 편집기를 실행하기 전에 실행 | |
commit-msg | commit 메시지를 완성한 후 commit 을 최종 완료하기 전에 실행 | |
post-commit | commit 을 완료한 후 실행 | |
pre-rebase | git-rebase에 의해 호출되며 브랜치가 리베이스되는 것을 방지하는 데 사용할 수 있다 | |
server-side | pre-receive | git-push 명령을 실행할 때 즉, 로컬 저장소에서 원격 저장소로 변경 사항을 전송할 때 호출됩니다. |
update | git-push 명령을 실행할 때 즉, 원격 저장소의 차몾를 업데이트하기 직전에 실행됩니다. | |
post-receive | 이 훅은 원격 저장소에서 실행되며, 모든 참조가 업데이트된 후에 한 번 실행됩니다. |
Git Hooks를 직접 설정하고 싶으신 분들은 여기를 참고하시면 됩니다.
GIt Hooks 설정을 쉽게 사용할 수 있도록 도와주는 도구가 바로 husky입니다.
husky
husky는 git 저장소에서 사용되는 Git hooks를 관리하고 실행하는 도구입니다.
husky를 통해 Git hooks 설정을 쉽게할 수 있고 이를 통해 코드 품질 검사, 테스트 실행, 커밋 메시지 검증 등과 같은 작업을 자동화하고 개발 팀의 코드베이스 품질을 향상시킬 수 있습니다.
husky는 현재 120만개가 넘는 프로젝트에서 사용중입니다.
설치 및 사용방법
간단 요약
husky 설치 -> hooks 생성 -> commit or push 하면 자동으로 동작
1. husky 설치
자동
`husky-init`는 husky로 프로젝트를 빠르게 초기화하기 위한 일회성 명령입니다.
- `npx husky-init && npm install`
초기화 과정이 완료되면 다음 작업이 수행됩니다.
1. `package.json`파일에 `prepare` 스크립트가 추가됩니다.
2. 기본적으로 `pre-commit` hooks가 생성되며, (기본 설정으로는 커밋할 때`npm test`명령이 실행됩니다)
3. Git hooks의 경로가 구성됩니다.
수동
1. husky 설치
- `npm install husky -D`
2. Git hooks 활성화
- `npx husky install`
3. 설치후 Git hooks를 자동으로 활성화 하려면 `package.json`을 아래와 같이 수정
{
"scripts": {
"prepare": "husky install"
}
}
- `prepare` 스크립트는 `npm install`명령어를 했을 때 자동으로 실행됩니다. 즉 다른 사람이 기여할 때 clone 받아서 레포를 사용할 때 제대로 동작하기 위해서 필요합니다. (관련 내용)
2. hooks 생성하기
hoosk에 명령을 추가하거나 새 명령을 생성하려면 `husky add <file> [cmd]`를 사용하세요. ( 단, 사용전에 `husky install` 하는 것을 잊지 마세요)
commit 하기전에 `prettire --write`를 동작하게 하고 싶으면 아래처럼 하면 됩니다.
만약 push 하기 전에 동작하게 하고 싶다면 `npx husky add .husky/pre-push "npm run prettire --write"를 입력하시면 됩니다.
npx husky add .husky/pre-commit "npm run prettire --write"
위 명령어를 입력하면 아래처럼 생성이 됩니다.
이제 해당 변경사항을 commit & push 한뒤에 commit을 하면 husky가 동작을 하게됩니다.
lint-staged
지금 위 설명한 세팅까지만 하면 commit 할때마다 linter or formatter가 모든 파일을 검사하기 때문에 상당한 시간이 소요됩니다.
이때 만약 staged되어있는 파일에만 linter or formatter를 사용할 수 있다면 ?
lint-staged는 커밋될 파일만 lint 및 기타작업을 할 수 있도록 도와주는 패키지 입니다.
즉 staged files에만 lint 및 기타작업을 수행합니다.
이렇게 하면 전체 파일에 linter or formatter을 사용할 필요가 없어서 훨씬 더 빠른 작업이 가능합니다.
설치 및 사용 방법
설치
1. `npm i lint-staged -D`
2. lint-staged를 `pre-commit` 실행하도록 Git Hook 설정
- 보통 husky로 많이 구성함
- `npx husky add .husky/pre-commit "npx lint-staged"`
3. Linter 및 기타 작업을 실행하도록 Lint-staged를 구성
방법 1 . package.json 내부에 구현
방법 2. `.lintstagedrc` 파일을 json, yml, mjs, cjs, js 로 파일 확장자를 명시적으로 지정할 수 있습니다.
.lintstagedrc
{
"*": "your-cmd"
}
lint-staged.config.js 실제 코드 보기
이렇게 설정하고 commit을 해보면 정상적으로 동작합니다.
husky와 lint-staged를 사용하는 패키지들 코드 직접보기
Reference
'정보' 카테고리의 다른 글
코드리뷰 잘 활용하기 (1) | 2023.10.23 |
---|---|
코딩테스트할 때 유용한 코드들 (1) | 2023.10.01 |
ESLint란 무엇이고 어떻게 사용할까? (0) | 2023.07.30 |
CSV 파일이란? (1) | 2023.01.21 |
더 좋은 코드를 위한 노력 - 코드 가독성 개선하기 (2) (0) | 2022.12.22 |