--- id: P-REINFORCE-AUTO-26C070 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 Pre-commit 훅을 ν™œμš©ν•œ 개발 μ›Œν¬ν”Œλ‘œμš° μžλ™ν™”" --- # [[Git Pre-commit 훅을 ν™œμš©ν•œ 개발 μ›Œν¬ν”Œλ‘œμš° μžλ™ν™”]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Git Pre-commit 훅은 컀밋이 μ½”λ“œ μ €μž₯μ†Œμ— 기둝되기 직전에 μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μŠ€ν¬λ¦½νŠΈμ΄λ‹€ [1]. 개발 νŒ€μ€ 주둜 Husky와 lint-staged 같은 도ꡬλ₯Ό κ²°ν•©ν•˜μ—¬ μ‚¬μš©ν•˜μ—¬, 컀밋 λŒ€μƒ 파일(staged files)에 λŒ€ν•΄μ„œλ§Œ 린트(Lint) 검사와 μ½”λ“œ ν¬λ§·νŒ…μ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•œλ‹€ [2, 3]. 이λ₯Ό 톡해 문법적 결함이 μžˆκ±°λ‚˜ νŒ€μ˜ μ»¨λ²€μ…˜μ— λ§žμ§€ μ•ŠλŠ” μ½”λ“œκ°€ μ €μž₯μ†Œμ— μœ μž…λ˜λŠ” 것을 사전에 μ°¨λ‹¨ν•˜κ³ , μΌκ΄€λœ μ½”λ“œ ν’ˆμ§ˆμ„ λΉ λ₯΄κ³  효율적으둜 μœ μ§€ν•  수 μžˆλ‹€ [3, 4]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **Git ν›…κ³Ό Pre-commit의 μ—­ν• :** Git 훅은 컀밋 생성 μ „(`pre-commit`), ν‘Έμ‹œ μ „(`pre-push`) λ“± Git μ›Œν¬ν”Œλ‘œμš°μ˜ νŠΉμ • 이벀트 μ‹œμ μ— μ‹€ν–‰λ˜λŠ” μ‰˜ μŠ€ν¬λ¦½νŠΈμ΄λ‹€ [1]. κ·Έμ€‘μ—μ„œλ„ `pre-commit` 훅은 μ½”λ“œκ°€ μ½”λ“œ μ €μž₯μ†Œμ— λ“€μ–΄κ°€κΈ° μ „μ˜ μ΅œν›„μ˜ λ°©μ–΄μ„  역할을 μˆ˜ν–‰ν•˜λ©°, λΉ λ₯Έ ν¬λ§·νŒ…μ΄λ‚˜ λ¦°νŒ…μ„ μžλ™ν™”ν•˜λŠ” 데 κ°€μž₯ μ ν•©ν•˜λ‹€ [1, 5]. * **Huskyλ₯Ό ν†΅ν•œ ν›… 관리:** 기본적으둜 Git 훅은 `.git/hooks/` 폴더에 둜컬둜 μ‘΄μž¬ν•˜κ³  버전 관리가 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ νŒ€μ›μ΄λ‚˜ CI ν™˜κ²½μ— μžλ™μœΌλ‘œ κ³΅μœ λ˜μ§€ μ•ŠλŠ” ν•œκ³„κ°€ μžˆλ‹€ [2]. HuskyλŠ” ν›… 슀크립트λ₯Ό `.husky/`와 같이 버전 관리 μ‹œμŠ€ν…œμ΄ 좔적할 수 μžˆλŠ” 디렉토리에 μ €μž₯ν•˜κ³ , Git의 `core.hooksPath`λ₯Ό λ³€κ²½ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 도ꡬ이닀 [2, 6]. `package.json`의 `prepare` 슀크립트 섀정을 톡해 νŒ€μ›μ΄ `npm install`을 μ‹€ν–‰ν•  λ•Œ μžλ™μœΌλ‘œ 훅이 μ—°λ™λ˜λ„λ‘ ꡬ성할 수 μžˆλ‹€ [7, 8]. * **lint-stagedλ₯Ό ν†΅ν•œ μ„±λŠ₯ 및 μ‹œκ°„ μ΅œμ ν™”:** 컀밋을 ν•  λ•Œλ§ˆλ‹€ μˆ˜λ§Žμ€ 파일둜 κ΅¬μ„±λœ 전체 μ½”λ“œλ² μ΄μŠ€μ— λŒ€ν•΄ ESLintλ‚˜ Prettierλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ‹œκ°„μ΄ 였래 κ±Έλ € 개발 생산성을 크게 μ €ν•˜μ‹œν‚¨λ‹€ [2, 5]. `lint-staged`λŠ” 였직 λ³€κ²½λ˜μ–΄ Git의 μŠ€ν…Œμ΄μ§• μ˜μ—­(staged files)에 μ˜¬λΌκ°„ νŒŒμΌλ“€λ§Œ ν•„ν„°λ§ν•˜μ—¬ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” λΌμš°ν„° 역할을 ν•˜λ―€λ‘œ, 검사 μ‹œκ°„μ„ 단 λͺ‡ 초 μ΄λ‚΄λ‘œ λŒ€ν­ 쀄여쀀닀 [2, 9, 10]. * **μžλ™ν™” μ›Œν¬ν”Œλ‘œμš° 톡합 λ™μž‘ 방식:** `pre-commit` ν›…μ—μ„œ `lint-staged`λ₯Ό ν˜ΈμΆœν•˜λ„λ‘ κ΅¬μ„±ν•˜λ©΄, 컀밋을 μ‹œλ„ν•  λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ ESLintλ₯Ό ν†΅ν•œ 였λ₯˜ κ²€μΆœ(및 `--fix`λ₯Ό ν†΅ν•œ μžλ™ μˆ˜μ •)κ³Ό Prettierλ₯Ό ν†΅ν•œ μ½”λ“œ 정렬이 이루어진닀 [7, 11]. `lint-staged`λŠ” ν¬λ§·νŒ…μœΌλ‘œ 인해 μˆ˜μ •λœ νŒŒμΌλ“€μ„ μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•  ν•„μš” 없이 μ•Œμ•„μ„œ λ‹€μ‹œ μŠ€ν…Œμ΄μ§• μ²˜λ¦¬ν•œλ‹€ [7, 10]. λ§Œμ•½ ν•΄κ²°ν•  수 μ—†λŠ” ꡬ문 였λ₯˜λ‚˜ κ·œμΉ™ μœ„λ°˜μ΄ 발견되면 μŠ€ν¬λ¦½νŠΈκ°€ μ‹€νŒ¨ν•˜λ©° 컀밋 ν”„λ‘œμ„ΈμŠ€κ°€ μ¦‰μ‹œ μ€‘λ‹¨λœλ‹€ [12]. * **둜컬 μžλ™ν™”μ™€ CI(지속적 톡합)의 관계:** κ°œλ°œμžλŠ” κΈ‰ν•˜κ±°λ‚˜ 훅이 κ³ μž₯ λ‚œ 경우 `--no-verify` ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ `HUSKY=0` ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ—¬ 둜컬 ν›… 싀행을 우회(Bypass)ν•  수 μžˆλ‹€ [13-15]. λ”°λΌμ„œ Git 훅은 κ°œλ°œμžμ—κ²Œ λΉ λ₯Έ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜λŠ” 도ꡬ일 뿐이며, μ΅œμ’…μ μΈ μ½”λ“œ κ°•μ œ μ§‘ν–‰κ³Ό μ™„λ²½ν•œ 보μž₯을 μœ„ν•΄μ„œλŠ” CI μ„œλ²„μ—μ„œ 전체 ν…ŒμŠ€νŠΈ 및 검사가 λ°˜λ“œμ‹œ λ³‘ν–‰λ˜μ–΄μ•Ό ν•œλ‹€ [14, 16, 17]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Husky]], [[lint-staged]], [[ESLint]], [[Prettier]], [[Continuous Integration (CI)]] - **Projects/Contexts:** [[νŒ€ λ‹¨μœ„ μ½”λ“œ ν’ˆμ§ˆ 및 μ»¨λ²€μ…˜ μœ μ§€]], [[λŒ€κ·œλͺ¨ λͺ¨λ…Έλ ˆν¬(Turborepo) ν™˜κ²½μ—μ„œμ˜ 린트 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜]] - **Contradictions/Notes:** `lint-staged`λŠ” 전체 ν”„λ‘œμ νŠΈλ₯Ό κ²€μ‚¬ν•˜λ„λ‘ μ„€κ³„λœ 도ꡬ(예: 전체 ꡬ쑰λ₯Ό νŒŒμ•…ν•΄μ•Ό ν•˜λŠ” `ng lint`λ‚˜ TypeScript의 `tsc --noEmit` λ“±)λ₯Ό λž˜ν•‘ν•˜λŠ” μš©λ„λ‘œλŠ” μ ν•©ν•˜μ§€ μ•ŠμœΌλ©°, 단일 파일 λ‹¨μœ„λ‘œ 처리 κ°€λŠ₯ν•œ μž‘μ—…μ—λ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [18-20]. λ˜ν•œ, μ„€μ • μ‹œ μ—¬λŸ¬ λͺ…λ Ήμ–΄κ°€ λ™μΌν•œ νŒŒμΌμ„ λ™μ‹œμ— μˆ˜μ •ν•˜λ„λ‘ κ΅¬μ„±ν•˜λ©΄ 경쟁 쑰건(Race condition)이 λ°œμƒν•˜μ—¬ μ½”λ“œκ°€ λ§κ°€μ§ˆ 수 μžˆμœΌλ―€λ‘œ, λͺ…λ Ήμ–΄ λ°°μ—΄(Array)을 μ‚¬μš©ν•˜μ—¬ 순차적으둜 μ‹€ν–‰λ˜κ²Œ μ„€μ •ν•΄μ•Ό ν•œλ‹€ [21]. --- *Last updated: 2026-04-18* ---