내 Django 프로젝트에서 Commit-Hook 루프를 탈출한 방법
Source: Dev.to
개발자라면 모두 깨끗하고 일관된 코드를 원합니다. pre-commit 같은 도구는 커밋 전에 자동으로 린터, 포매터, 기타 검사를 실행해 이를 가능하게 합니다. 하지만 실제 프로젝트에서 사용해 보면 커밋‑훅 루프라는 끔찍한 상황을 겪어보았을 겁니다.
저는 최근 Django 프로젝트를 진행하면서 이 문제에 직면했습니다. 문제와 해결 과정을 차근차근 설명드리겠습니다.
The Context
다음과 같은 전형적인 파이썬 스택으로 Django 프로젝트를 구축하고 있습니다:
- Django 5.x
- Python 3.12
- Black (포매팅)
- Flake8 (린팅)
- isort (import 정렬)
- pre-commit (훅 관리)
목표는 간단합니다: 매 커밋마다 자동으로 코드 품질을 강제하는 것.
The Problem: Commit‑Hook Loop
제가 사용하던 워크플로는 다음과 같습니다:
git add .
git commit -m "Some message"
이 시점에서 pre‑commit 훅이 자동으로 실행됩니다. 훅이 실패하면(예: Black이 파일을 재포맷) 커밋이 중단됩니다. 그럼 저는 다음을 해야 합니다:
- 문제를 수정
git add .다시 실행git commit다시 실행
… 그리고 모든 훅이 통과할 때까지 반복합니다. 파일이 많은 대규모 Django 프로젝트에서는 add → commit → fail → fix → add → commit이라는 고통스러운 루프에 빠지게 됩니다.
The Solution: Run Pre‑Commit Before Committing
커밋에만 의존해 훅을 트리거하는 대신, 커밋하기 전에 pre‑commit을 수동으로 실행하기 시작했습니다:
pre-commit run --all-files
git add .
git commit -m "Your commit message"
Why This Works Better
- 훅이 스테이징된 파일이 아니라 모든 파일에 대해 실행됩니다.
- 자동으로 고칠 수 있는 문제(예: 포매팅)는 커밋 전에 해결됩니다.
- 커밋 거부 루프를 완전히 피할 수 있습니다.
Making It Even Smoother: One Command
모든 과정을 한 줄 명령으로 결합할 수 있습니다:
pre-commit run --all-files && git add . && git commit -m "Your commit message"
- 먼저 pre‑commit 실행
- 자동 수정된 파일을 스테이징
- 중단 없이 깔끔하게 커밋
Optional: Enforcing Hooks on Push
팀이 훅을 우회하지 못하도록 pre‑push에 훅을 설치할 수도 있습니다:
pre-commit install --hook-type pre-push
이제 푸시할 때마다 코드 품질을 검사하므로 CI/CD 파이프라인에 추가적인 안전망을 제공합니다.
Final Thoughts
이와 같이 pre‑commit을 활용하면 Django 프로젝트에서 수시간에 달하는 좌절을 없앨 수 있습니다. 핵심 포인트는:
커밋이 문제를 잡을 때까지 기다리지 말고, 먼저 pre‑commit을 실행해 수정하고, 그 다음 커밋하라.
Django와 파이썬 개발자에게 이 워크플로는 코드를 깨끗하고 일관되며 푸시 준비가 된 상태로 유지해 주며, 끔찍한 커밋‑훅 루프를 방지합니다.
💡 Tip: 이 명령을 git 별칭이나 셸 스크립트로 추가하면 워크플로에 자연스럽게 녹아듭니다. 시간이 지나면 존재 자체를 거의 느끼지 못할 정도로 편리해지지만, 절약된 시간은 크게 느껴질 겁니다!