[220110] git pre-commit으로 cljfmt 적용하기
Table of Contents
1 git pre-commit
git 관련 이벤트가 발생하였을 때, 특정 스크립트를 수행할 수 있다. 클라이언트, 서버 훅으로 나뉜다.
클라이언트 훅 - commit
, merge
서버 훅 - push
하면 서버에서 수행
2 설치
git init
을 수행한 폴더 내 .git/hooks
밑에 저장한다. 실제로 들어가면 예시들이 존재한다.
3 클라이언트 훅
3.1 pre-commit
커밋 메시지를 작성하기 전에 호출된다. 커밋할 때 꼭 확인해야 하는 것이 있으면 이 훅을 사용한다.
git commit --no-verify
로 일시적으로 훅을 멈출 수 있다.
코드 스타일을 검사하는데 좋다.
3.2 prepare-commit-msg
일반 커밋에는 별로 필요 없고 커밋 메시지를 자동으로 생성하는 커밋에 좋다. 커밋 메시지에 템플릿을 적용하거나, Merge 커밋, Squash 커밋, Amend 커밋일 때 유용하다.
이 스크립트로 커밋 메시지 템플릿에 정보를 삽입할 수 있다.
3.3 commit-msg
커밋 메시지가 들어 있는 임시 파일의 경로를 아규먼트로 받는다.
스크립트가 0
을 반환해야 커밋이 된다.
이 훅에서 최종적으로 커밋이 완료되기 전에 프로젝트 상태나 커밋 메시지를 검증한다.
4 실전으로 들어가기
프로젝트루트에서 .git/hooks/pre-commit
파일을 생성한다.
그곳에 아래와 같은 코드를 추가한다.
#!/usr/bin/env bash git status --short \ | egrep "^\s*(M|\?\?)\s" \ | grep 'clj$' \ | awk '{print $2}' \ | xargs clj -Sdeps "{:deps {cljfmt/cljfmt {:mvn/version \"0.8.0\"}}}" -M -m cljfmt.main fix git status --short | egrep "^\s*MM\s" | awk '{print $2}' | grep "clj$" | xargs git add
이렇게 하면 git commit 을 수행할 때마다 내가 변경한 파일에 모두 cljfmt
를 수행 한 후, 변경사항에 추가한다.
shell
의 경우 종립님의 도움을 받았다. shell
에 대해서 심층적으로 알아보는 시간을 가져야겠다.
5 내가 팀에서 사용하는 방식.
대충 이런식으로 만듬.
프로젝트 루트에서 .git/hooks/pre-commit
은 github에 올라가지 않는다.
이것을 해결하기 위해 프로젝트 루트에 pre-commit
이라는 파일을 생성한다.
그 다음에 심볼릭 링크를 .git/hooks/pre-commit
에 추가한다.
ln -s <원본파일> <링크파일> ln -s ../../pre-commit .git/hooks/pre-commit