pre-commit은 로컬에서 리모트 브랜치에 커밋을 할 때,
특정한 룰에 의해 코드를 포맷팅하거나 기타 작업을 자동으로 적용시켜주는 기능이다.
예를 들어 내가 커밋한 코드가 black format을 따른다고 할 때,
해당 포맷을 지키지 않은 채로 커밋을 하게되면 자동으로 black format을 적용시켜준다.
# AS-IS : 들여쓰기와 공백이 지켜지지 않은 내 코드
def add(a, b) :return a+b
# TO-BE : pre-commit을 통해 black 스타일을 적용한 코드
def add(a, b):
return a + b
> https://black.readthedocs.io/en/stable/
가장 간단하게는 Extension을 써서 저장 시 마다 파일에 black format을 자동 적용하는 방법도 있고,
라이브러리를 다운 받아서 지정한 파일에 대한 스타일을 통일하도록 하는 방법도 있지만..
내 로컬 PC에만 국한되는 범위이며, git을 이용한 협업 시에는 팀원들 모두가 이러한 세팅을 거쳐야하는 번거로움이 있다.
pre-commit은 팀원들 각자의 pc에 최초 설정만 진행하면
git 커밋 시 자동으로 적용해주기 때문에 협업이 보다 효율적으로 진행된다는 장점도 있다.
오늘은 pre-commit을 이용해서 코드 포맷터를 자동으로 설정하는 방법과
Untracked file(새로운 파일)을 커밋할 때, 사전에 지정한 문구를 파일 상단에 추가하는 방법까지 다뤄보도록 하겠다.
Pre-commit의 위치
pre-commit은 로컬 PC에서 내가 커밋한 코드를 후킹(hook)하여 갖가지 조건을 검사한다.
git repository와 연결이 되어있으면 터미널을 통해 아래 경로에 pre-commit 파일이 생성되어야 함을 인지해보자.
본인의 repository 내 .git/hooks 폴더 안에 pre-commit이 위치해야 한다.
아직 파일을 생성하기 전 단계이니, 없는 것이 당연하다.
Pre-commit 설정 방법
pre-commit 패키지 설치
어쨌든 위의 위치에 pre-commit 파일에 내용을 작성하고 저장하기만 하면 된다는 것이다.
bash나 powershell을 통해 직접 파일에 내용을 써도 되지만,
어지럽게 cli에서 코드를 쓰고 권한 부여하는 등의 복잡한 일처리는 파이썬 정신에 어긋난다.
그러니 pre-commit 패키지를 쓰도록 하자.
pip install pre-commit
pre-commit-config.yaml 설정파일 만들기
패키지 설치가 완료되었으면 pre-commit 파일을 어떻게 만들 것인지에 대한 설정 파일을 작성해주어야 한다.
.pre-commit-config.yaml 파일을 내 레포지토리 루트 폴더에 만들어주자.
파일을 생성했다면, 이제 아래와 같은 포맷으로 설정해보자.
# .pre-commit-config.yaml
default_language_version:
python: python3
repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit # 포맷터의 git 주소
rev: 'v0.0.256' # 버전
hooks:
- id: ruff
args: ["--fix"] # 잘못된 포맷이 있다면 올바르게 고치기까지 하라는 명령어
- repo: local # 커스텀 코드를 따르고 있으니 local로 repository를 설정
hooks:
- id: copyright header
name: Add header copyright to files
entry: python scripts/copyright.py # 실행할 스크립트의 경로
language: python
files: \.py$
나는 ruff라는 포맷터를 이용해 내 코드를 검사하고 적용할 것이고,
내가 커스텀으로 만든 주석 추가 스크립트도 같이 포함할 것이다.
만약 config 파일 작성에 어려움이 있다면 gpt보고 만들어달라고 하자.
yaml 파일이 모두 작성됐다면 터미널에 아래 코드만 입력해주면 된다.
pre-commit 파일 만들어주기
pre-commit install
이제 다시 .git/hooks 폴더로 이동하여 파일 리스트를 찍어보면 pre-commit 파일이 나오는 것을 볼 수 있다.
내용까지 확인해보자.
커밋해보기
컨벤션을 어긴 간단한 코드로 테스트를 해보자
왼쪽의 코드로 커밋을 날렸더니 아래와 같은 에러가 발생하면서 오른쪽과 같이 코드가 자동으로 변경되었다.
> git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
[WARNING] Unstaged files detected.
[INFO] Stashing unstaged files to C:\Users\gnsdl\.cache\pre-commit\patch1738472716-41048.
ruff.....................................................................Failed
- hook id: ruff
- files were modified by this hook
Found 1 error (1 fixed, 0 remaining).
Add header copyright to files............................................Failed
- hook id: copyright header
- files were modified by this hook
[WARNING] Stashed changes conflicted with hook auto-fixes... Rolling back fixes...
[INFO] Restored changes from C:\Users\gnsdl\.cache\pre-commit\patch1738472716-41048.
Changes의 변경사항이 추가되었고 이 파일을 stage로 올린 뒤에 커밋하면 정상적으로 커밋이 되는 것을 볼 수 있을 것이다.