티스토리 뷰
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
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
id가 black인 hook은 어디 정의돼있는걸까
여기 있다.
https://github.com/psf/black/blob/main/.pre-commit-hooks.yaml
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
autopep8을 쓴다면 아래와 같이 .pre-commit-config.yaml 파일 작성하면 됨
근데 autopep8 프로젝트에는 .pre-commit-hooks.yaml 가 없다.
https://github.com/hhatto/autopep8
.pre-commit-hooks.yaml 이 따로 작성안돼있는 프로젝트들은 pre-commit 그룹에서 mirroring 하여 구현된 걸 확인할 수 있다.
https://github.com/pre-commit/mirrors-autopep8
그래서 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
참고 자료
https://www.daleseo.com/pre-commit/
https://www.daleseo.com/python-black/
https://www.youtube.com/watch?v=psjz6rwzMdk
'Python' 카테고리의 다른 글
[Python] eval 사용을 피하는 방법 1. getattr (0) | 2023.03.05 |
---|---|
Anaconda 에서 miniconda 로 갈아타다. (0) | 2023.03.04 |
[Python] auto-formatter black 맛보기 (0) | 2023.02.14 |
[Python] 문자열이 파이썬 예약어(keyword)에 속하는지 확인하는 방법 (0) | 2023.02.13 |
[Python] string 값에 해당하는 변수 유무 검사 방법 (0) | 2023.02.13 |
- Total
- Today
- Yesterday
- 가장 긴 증가하는 부분 수열
- C++ Deploy
- LCA
- 파이참
- FairMOT
- cosine
- 단축키
- 문제집
- ㅂ
- Lowest Common Ancestor
- 조합
- PyCharm
- 백준
- 자료구조
- MOT
- 이분탐색
- 인공지능을 위한 선형대수
- 백트래킹
- 백준 1766
- 백준 11053
- 백준 11437
- 순열
- 위상 정렬 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |