일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로젝트
- 운영체제
- 오라클 디비
- jsp
- spring
- JVM
- dynamic query
- smart cast
- resilience4j
- 알고리즘
- 자바 프로젝트
- 자바
- 파이썬 소스
- 백준 알고리즘
- 티스토리
- 초대장
- 유사코드
- oracle
- 문법 정리
- auto configure
- gradle
- 오라클
- SQL
- c#
- hyperledger
- 리눅스
- K6
- MongoDB
- 파이썬
- 학점
- Today
- Total
모종닷컴
Git Commit 전에 스크립트를 통해 포맷 체크하기 본문
.git 디렉토리로 이동하면 hooks 라는 폴더가 존재합니다. 이를 살펴보면 아래와 같이 파일들이 존재합니다.
Git Hook
git hook은 리포지토리에서 특정 이벤트가 발생할 때마다 자동으로 실행되는 스크립트라고 합니다. 리포지토리를 초기화하면 Git은 이 디렉터리에 샘플 스크립트를 자동으로 만들어줍니다. 확장자가 .sample로 되어있는데 이 경우 .sample 확장자를 제거하지 않으면 실행이 되지 않는다고 합니다.
Hook 범위
Hook는 특정 Git 리포지토리에 로컬로 존재하고 git clone을 실행할 때 리포지토리로 복사되지 않는다고 합니다. 이 말을 좀 더 풀어 해석하자면 .git/hooks 디렉토리가 버전 제어가 어렵기 때문에 팀 단위의 개발이라면 관리하는 것이 약간 까다로울수 있다고 합니다.
따라서 hook 스크립트를 관리하기 위해서는 프로젝트의 다른 디렉토리에 hook 스크립트를 넣어놓고 심볼릭 링크를 만들어서 사용하는 방법을 제시하고 있네요.
Pre-Commit 이용해보기
pre-commit 스크립트는 git commit 을 실행할 때마다 실행됩니다. 파일명 prefix에 "pre-"라는 것을 통해 git이 commit을 하기 직전에 실행되는 스크립트라는 것을 알수 있습니다.
pre-commit 스크립트에는 인수가 전달되지 않으며 0이 아닌 상태로 종료하면 커밋이 중단됩니다.
저는 프로젝트에 kotlinter를 사용하고 있는데 만약 Gradle에서 포맷이 맞춰지지 않은 코드가 존재한다면 빌드를 돌다가 실패하도록 되어있습니다. 아래 사진은 포맷이 맞춰지지 않은 상태에서 원격 리포지토리에 push를 하였고, github action에서 빌드하다가 실패한 사진입니다.
보통 이 경우 다시 로컬에서 포맷을 맞춰주고 원격 리포지토리에 다시 올리면 되겠지만 번거로운 일입니다. 따라서 pre-commit에 만약 포맷이 맞춰지지 않은 코드가 존재한다면 commit이 취소되도록 만들어 볼 예정입니다.
파일 생성
루트 프로젝트에서 .git/hooks 폴더에 들어갑니다.
cd .git/hooks
다음으로 pre-commit 파일 하나를 생성합니다.
touch pre-commit
실행을 해야하기 때문에 실행 권한을 부여합니다.
chmod +x pre-commit
스크립트 내용
vi pre-commit
#!/bin/sh
./gradlew lintKotlinMain
if [ $? -ne 0 ]; then
echo "lintKotlinMain 실패! commit이 중단되었습니다."
exit 1
fi
exit 0
테스트
이제 일부로 포맷에 어긋나는 코드를 하나 만들고 커밋을 해보겠습니다. 저는 줄 마지막 부분에 빈칸을 넣어서 no trailing space를 어겨보겠습니다. 아래 사진과 같이 뒤에 빈칸 하나를 넣었습니다.
커밋을 해보면 "lintKotlinMain 실패! commit이 중단되었습니다."를 볼 수 있었습니다.
'Programming' 카테고리의 다른 글
Kotlin Contract (0) | 2023.07.28 |
---|---|
Github Action에서 Gradle Build 에러 리포트 파일 받아보기 (0) | 2023.04.16 |
Reactor3's SwitchIfEmpty with lazy evaluation.. (0) | 2023.03.10 |
Reactive Streams & Reactive Programming (0) | 2023.02.18 |
SQS 중복 수신 이슈 (0) | 2022.12.24 |