티스토리 뷰

pre-commit 이란 commit 하기전 user가 정의한 특정한 작업들이 자동으로 실행되게 도와주는 툴로 생각하면된다.

 

commit 하기전에 formatting 잘했는지 정도의 최소한의 검증 과정이 존재하는 것 만으로 프로젝트 관리에 아주 유용할 것이다.

 

위 같은 검증을 ci/cd 단계에서 특정 Server에서 해준다고하더라도, Local에서 검증 과정을 거치지 않고 push를 하게되면 ci/cd용 Server 에서 장고의 시간을 거친뒤에서야 문제를 찾을 수 있을거다. 그리고 그 문제가 formatting 같이 사소한거라면 상당히 열 받을지도 모른다. Local에서 한 번 검증을 해주고 push 하면 ci/cd용 Server에서 발생하는 ci/cd횟수와 ci/cd 통과 여부를 확인하는 동안의 대기 시간을 감소시킬 수 있을 것이다.


git project에다가 근본없는 format으로 app.py 라는 파일을 생성하고 코드를 아래와 같이 작성해놓았다.

import os, sys

def func(a, b
         ,c, d, e,
         f,
         ):
    pass

a= 1+2
b = 1 + 2
c =1 +2
d =1+ 2
e=1 +2
f= 1+2

l = [i 
     for i 
     in range(10)]

print(l)

 

그리고 pre-commit 을 이용해 commit전 항상 특정 script 가 실행되게 해보자. 여기서 특정 script 는 python auto-foramtter인 black이 되겠다.

 

https://developer0hye.tistory.com/entry/Python-auto-formatter-black-%EB%A7%9B%EB%B3%B4%EA%B8%B0

 

[Python] auto-formatter black 맛보기

https://github.com/psf/black GitHub - psf/black: The uncompromising Python code formatter The uncompromising Python code formatter. Contribute to psf/black development by creating an account on GitHub. github.com auto-formatter 로 black을 사용해보려

developer0hye.tistory.com

 

1. pre-commit을 설치해주자.

pip install pre-commit

2. project의 루트 경로에 .pre-commit-config.yaml 를 생성하자

3. .pre-commit-config.yaml 내용 작성

repos:
-   repo: https://github.com/psf/black
    rev: 23.1.0
    hooks:
    -   id: black

black repo에서 tag가 23.1.0인 버전의 black을 받아서 id가 black인 hook을 실행시킨다. 라는 의미다. 

 

black repo의 tags 는 아래에서 확인 가능하다.

https://github.com/psf/black/tags

 

GitHub - psf/black: The uncompromising Python code formatter

The uncompromising Python code formatter. Contribute to psf/black development by creating an account on GitHub.

github.com

 

id가 black인 hook은 어디 정의돼있는걸까

 

여기 있다.

https://github.com/psf/black/blob/main/.pre-commit-hooks.yaml

 

GitHub - psf/black: The uncompromising Python code formatter

The uncompromising Python code formatter. Contribute to psf/black development by creating an account on GitHub.

github.com

 

pre-commit 에 관심이 너무 많이 생겨 직접 구현할 거 아니면 단순히 저거 한줄한줄 해석할 필요는 없어보인다.

 

4. git hook 생성을 위한 pre-commit install 명령어 실행

pre-commit install

위 명령을 실행하면 {project}/.git/hooks/ 에 pre-commit 이란 파일이 생길것이다.

이거 직접 작성안해주려고 pre-commit 쓴거니까 이거 해석할 필요는 없어보인다.

 

5. commit 해서 잘되나 확인

git add app.py
git commit -m "pre-commit test"

black을 설치한다는 안내문이 뜬다. 근데 어디에 설치한거지...?

commit은 실패했고 근본 없는 포맷으로 작성된 app.py 가 예쁘게 정렬 됐다.

실패하고나서 push 하려하면 push가 안될것이다.

코드가 black에 의해 수정됐으니 다시 staging을 하고 commit을 해보자

git add app.py
git commit -m "pre-commit test"

통과했다.

그리고 push 하면된다.

 

예시 코드는 아래 프로젝트에서 확인 가능

 

https://github.com/developer0hye/hello-githook-and-black-world

 

GitHub - developer0hye/hello-githook-and-black-world

Contribute to developer0hye/hello-githook-and-black-world development by creating an account on GitHub.

github.com

 

autopep8을 쓴다면 아래와 같이 .pre-commit-config.yaml 파일 작성하면 됨

 

근데 autopep8 프로젝트에는 .pre-commit-hooks.yaml  가 없다.

 

https://github.com/hhatto/autopep8

 

GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.

A tool that automatically formats Python code to conform to the PEP 8 style guide. - GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.

github.com

 

.pre-commit-hooks.yaml 이 따로 작성안돼있는 프로젝트들은 pre-commit  그룹에서 mirroring 하여 구현된 걸 확인할 수 있다.

 

https://github.com/pre-commit/mirrors-autopep8

 

GitHub - pre-commit/mirrors-autopep8: Mirror of the autopep8 package for pre-commit

Mirror of the autopep8 package for pre-commit. Contribute to pre-commit/mirrors-autopep8 development by creating an account on GitHub.

github.com

그래서 repo에 mirroring 된 repo를 기입해줘야한다.

repos:
  - repo: https://github.com/pre-commit/mirrors-autopep8
    rev: v2.0.1
    hooks:
      - id: autopep8

pre-commit 사용 프로젝트 예시

ultralytics 프로젝트(yolov8)가 pre-commit을 쓴다.

https://github.com/ultralytics/ultralytics/blob/main/.pre-commit-config.yaml

 

GitHub - ultralytics/ultralytics: YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/ultralytics development by creating an account on GitHub.

github.com

참고 자료

https://www.daleseo.com/pre-commit/

 

pre-commit 도구로 Git Hook 사용하기

Engineering Blog by Dale Seo

www.daleseo.com

https://www.daleseo.com/python-black/

 

Black으로 파이썬 코드 스타일 통일하기

Engineering Blog by Dale Seo

www.daleseo.com

https://www.youtube.com/watch?v=psjz6rwzMdk 

https://pre-commit.com/

 

pre-commit

 

pre-commit.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함