๐Git Hooks๋?
Git์ด ํน์ ์ด๋ฒคํธ(์ปค๋ฐ, ํธ์ ๋ฑ) ๋ฐ์ ์ ์๋์ผ๋ก ์คํํ๋ ์คํฌ๋ฆฝํธ.
.git/hooks/ ํด๋์ ์์นํ์ง๋ง — .git/์ git์ด ์ถ์ ํ์ง ์์ผ๋ฏ๋ก ํ์๊ณผ ๊ณต์ ๋ถ๊ฐ. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ Husky.
๐Husky๋?
Git hooks๋ฅผ ํ๋ก์ ํธ ํด๋ ๋ด๋ถ(.husky/)์ ๋๊ณ ๋ฒ์ ๊ด๋ฆฌ·ํ ๊ณต์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
๋์ ์๋ฆฌ
- npm install ์ prepare ์คํฌ๋ฆฝํธ๋ก husky install ์คํ
- Husky๊ฐ git config core.hooksPath .husky๋ฅผ ์ค์ — git์ด .git/hooks/ ๋์ .husky/๋ฅผ ๋ณด๊ฒ ๋ง๋ฌ
- .husky/pre-commit, .husky/pre-push ๋ฑ์ ๋ง๋ค๋ฉด git์ด ํด๋น ์์ ์ ์๋ ์คํ
์ค์น
npm install --save-dev husky
npx husky init # .husky/ ํด๋ ์์ฑ + package.json์ prepare ์คํฌ๋ฆฝํธ ์ถ๊ฐ
ํ ์ถ๊ฐ
echo "npm test" > .husky/pre-commit
๐์ฃผ์ ํ : pre-commit vs pre-push
pre-commit
- ์์ : git commit ์คํ ์, ์ปค๋ฐ์ด ๋ง๋ค์ด์ง๊ธฐ ์ง์
- ์คํจํ๋ฉด: ์ปค๋ฐ ์์ฒด๊ฐ ๋ง๋ค์ด์ง์ง ์์
- ์ฉ๋: ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ๊ฒ์ฆ — ์คํ ์ด์ง๋ ํ์ผ์ ๋ํ lint·format·ํ์ ์ฒดํฌ
- ์ฃผ์: ๋ชจ๋ ์ปค๋ฐ๋ง๋ค ์คํ๋๋ฏ๋ก ๋๋ฆฌ๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ ์ ํ. ๋ณดํต lint-staged์ ์กฐํฉํด ๋ณ๊ฒฝ๋ ํ์ผ๋ง ๊ฒ์ฌ
# .husky/pre-commit
npx lint-staged
pre-push
- ์์ : git push ์คํ ์, ์๊ฒฉ์ผ๋ก ๋ณด๋ด๊ธฐ ์ง์
- ์คํจํ๋ฉด: ํธ์๊ฐ ๋งํ (๋ก์ปฌ ์ปค๋ฐ์ ๊ทธ๋๋ก ์ ์ง)
- ์ฉ๋: ๋ฌด๊ฑฐ์ด ๊ฒ์ฆ — ์ ์ฒด ํ ์คํธ, ๋น๋, ๋ณด์ ์ค์บ
- ์ฅ์ : ์ปค๋ฐ์ ์์ ๋กญ๊ฒ ํ๋, ์๊ฒฉ์ ๋ง๊ฐ์ง ์ฝ๋๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฑด ๋ฐฉ์ง
# .husky/pre-push
npm run build:prod
npm test
์ฐจ์ด ๋น๊ต
| ํญ๋ชฉ | pre-commit | pre-push |
| ์ ํฉํ ์์ | ๊ฐ๋ฒผ์ (lint, format) | ๋ฌด๊ฑฐ์ (build, test) |
| ์ฐํ | git commit --no-verify | git push --no-verify |
์ค์ ๊ถ์ฅ ํจํด
- pre-commit: lint-staged๋ก ๋ณ๊ฒฝ ํ์ผ๋ง ๋น ๋ฅด๊ฒ ๊ฒ์ฌ (1-2์ด)
- pre-push: ์ ์ฒด ํ ์คํธ·๋น๋ (์์ญ ์ด~๋ถ)
- commit-msg: ์ปค๋ฐ ๋ฉ์์ง ์ปจ๋ฒค์ ๊ฒ์ฆ (commitlint)
์ฃผ์์ฌํญ
- --no-verify๋ก ์ฐํ ๊ฐ๋ฅํ๋ฏ๋ก CI์์๋ ๋์ผ ๊ฒ์ฆ์ ๋๋ ค์ผ ํจ (ํ ์ 1์ฐจ ๋ฐฉ์ด์ ์ผ ๋ฟ)
- ํ์์ด npm install ์ ํ๋ฉด ํ ๋ฏธ์๋ — README์ ๋ช ์ ํ์
- Windows์์ ์ค๋ฐ๊ฟ(LF/CRLF) ์ด์๋ก ํ ์ด ์ ๋ ์ ์์ → .gitattributes๋ก LF ๊ฐ์