--- id: P-REINFORCE-AUTO-F69A27 category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Git Hooks" --- # [[Git Hooks]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Git HooksλŠ” Git μ›Œν¬ν”Œλ‘œμ˜ νŠΉμ • 이벀트(commit, push, merge λ“±)κ°€ λ°œμƒν•  λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λ„λ‘ μ„€μ •ν•  수 μžˆλŠ” μ…Έ 슀크립트 λ˜λŠ” μ‹€ν–‰ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€ [1-3]. 주둜 κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό μ»€λ°‹ν•˜κ±°λ‚˜ ν‘Έμ‹œν•˜κΈ° 직전에 린트(Lint), μ½”λ“œ ν¬λ§·νŒ…, ν…ŒμŠ€νŠΈ 등을 μ‹€ν–‰ν•˜μ—¬ 였λ₯˜κ°€ μžˆλŠ” μ½”λ“œκ°€ 리포지토리에 μ €μž₯λ˜λŠ” 것을 λ°©μ§€ν•˜κ³  μ½”λ“œ 퀄리티λ₯Ό μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€ [4, 5]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **μœ„μΉ˜ 및 ꡬ동 방식** 기본적으둜 Git Hook μŠ€ν¬λ¦½νŠΈλ“€μ€ ν”„λ‘œμ νŠΈμ˜ `.git/hooks/` 폴더에 μœ„μΉ˜ν•©λ‹ˆλ‹€ [3, 6]. Git은 `core.hooksPath`κ°€ κ°€λ¦¬ν‚€λŠ” 경둜의 μŠ€ν¬λ¦½νŠΈλ“€μ„ ν™•μΈν•˜μ—¬ νŠΉμ • Git λͺ…령이 μ‹€ν–‰λ˜κΈ° 전후에 이λ₯Ό ν˜ΈμΆœν•˜λ©°, μ‹€ν–‰ κΆŒν•œμ΄ λΆ€μ—¬λ˜μ§€ μ•Šμ€ Hook은 λ¬΄μ‹œλ©λ‹ˆλ‹€ [3]. * **버전 κ΄€λ¦¬μ˜ ν•œκ³„μ™€ ν•΄κ²°μ±…** `.git/hooks/` λ””λ ‰ν„°λ¦¬λŠ” 버전 관리(Version Control) μ‹œμŠ€ν…œμ— μ˜ν•΄ μΆ”μ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μƒˆλ‘œμš΄ νŒ€μ›μ—κ²Œ 섀정이 μžλ™μœΌλ‘œ κ³΅μœ λ˜μ§€ μ•ŠμœΌλ©° 리포지토리λ₯Ό λ‹€μ‹œ 클둠할 λ•Œλ§ˆλ‹€ 섀정이 μœ μ‹€λ˜λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€ [6]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 개발 μƒνƒœκ³„μ—μ„œλŠ” `Husky`와 같은 도ꡬλ₯Ό λ„μž…ν•˜μ—¬ Hook 슀크립트λ₯Ό `.husky/`와 같이 좔적 κ°€λŠ₯ν•œ ν΄λ”μ—μ„œ κ΄€λ¦¬ν•˜λ„λ‘ `core.hooksPath` 섀정을 μžλ™ν™”ν•©λ‹ˆλ‹€ [6, 7]. * **μ£Όμš” Client-side Hooks μ’…λ₯˜** * **`pre-commit`**: 컀밋이 μƒμ„±λ˜κΈ° 직전에 μ‹€ν–‰λ˜λ©° μŠ€ν…Œμ΄μ§•λœ 파일의 ν¬λ§·νŒ…μ΄λ‚˜ 린트 검사λ₯Ό μˆ˜ν–‰ν•˜λŠ” 데 주둜 μ“°μž…λ‹ˆλ‹€ [1, 2, 8]. 맀우 λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λ©°, `git commit --no-verify` λͺ…령을 톡해 μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 9]. * **`prepare-commit-msg`**: 컀밋 λ©”μ‹œμ§€ νŽΈμ§‘κΈ°κ°€ 열리기 전에 μ‹€ν–‰λ˜μ–΄ λ©”μ‹œμ§€ ν…œν”Œλ¦Ώ μ‚½μž… 등을 μ²˜λ¦¬ν•˜λ©°, μš°νšŒν•  수 μ—†λŠ” νŠΉμˆ˜ν•œ Hookμž…λ‹ˆλ‹€ [1, 8]. * **`commit-msg`**: μž‘μ„±λœ 컀밋 λ©”μ‹œμ§€ ν˜•μ‹μ„ μœ νš¨μ„± κ²€μ‚¬ν•˜λŠ” 데 μ“°μž…λ‹ˆλ‹€ [1, 2, 8]. * **`post-commit`**: 컀밋이 μ™„λ£Œλœ ν›„ ν˜ΈμΆœλ©λ‹ˆλ‹€ [1]. * **`pre-push`**: 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œ(push)되기 직전에 μ‹€ν–‰λ©λ‹ˆλ‹€ [2, 8, 10]. μƒλŒ€μ μœΌλ‘œ μ‹€ν–‰ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” 전체 ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ μ‹€ν–‰μ΄λ‚˜ λΉŒλ“œ 검증 μž‘μ—…μ΄ 이곳에 λ°°μΉ˜λ©λ‹ˆλ‹€ [9, 11]. * **`post-merge`**: 병합(merge) μž‘μ—…μ΄ μ™„λ£Œλœ ν›„ μ‹€ν–‰λ©λ‹ˆλ‹€ [2]. * **μ΅œμ ν™” 방법둠 (Lint-staged κ²°ν•©)** `pre-commit` Hookμ—μ„œ 전체 ν”„λ‘œμ νŠΈλ₯Ό λŒ€μƒμœΌλ‘œ ESLintλ‚˜ Prettierλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ‹œκ°„μ΄ 였래 κ±Έλ € κ°œλ°œμžλ“€μ˜ λΆˆλ§Œμ„ μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [6, 9]. λ”°λΌμ„œ 변경사항이 λ°œμƒν•˜μ—¬ 컀밋 λŒ€κΈ° μƒνƒœκ°€ 된 파일(Staged files)에 λŒ€ν•΄μ„œλ§Œ 린트 및 ν¬λ§·νŒ… 검사λ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ `lint-staged`λ₯Ό κ²°ν•©ν•˜λŠ” 것이 일반적이며 이λ₯Ό 톡해 검사 μ‹œκ°„μ„ 크게 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€ [5, 6, 12, 13]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** `[[Husky]]`, `[[lint-staged]]`, `[[ESLint]]`, `[[Prettier]]` - **Projects/Contexts:** `[[CI/CD νŒŒμ΄ν”„λΌμΈ (CI/CD Pipelines)]]`, `[[μ½”λ“œ ν’ˆμ§ˆ 관리 및 μžλ™ν™” (Code Quality Management and Automation)]]` - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ Git Hook은 κ°œλ°œμžκ°€ κ°•μ œλ‘œ 우회(`--no-verify` λ“±)ν•  수 μžˆμœΌλ―€λ‘œ μ ˆλŒ€μ μ΄κ³  μ™„λ²½ν•œ κ°•μ œ μˆ˜λ‹¨μ΄ 될 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ Hook은 둜컬 ν™˜κ²½μ—μ„œ λΉ λ₯Έ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜κΈ° μœ„ν•œ λ„κ΅¬λ‘œ μ·¨κΈ‰λ˜μ–΄μ•Ό ν•˜λ©°, μ΅œμ’…μ μΈ λ³΄μ•ˆ 및 ν’ˆμ§ˆ κ²€μ¦μ˜ κΆŒν•œμ€ 항상 CI(지속적 톡합) μ„œλ²„κ°€ λ‹΄λ‹Ήν•΄μ•Ό ν•œλ‹€κ³  κ°•μ‘°ν•©λ‹ˆλ‹€ [8, 14, 15]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/Git Hooks.md]] ---