모종닷컴

Git Commit 전에 스크립트를 통해 포맷 체크하기 본문

Programming

Git Commit 전에 스크립트를 통해 포맷 체크하기

모종 2023. 4. 23. 18:42
반응형

.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이 중단되었습니다."를 볼 수 있었습니다.

반응형