[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

6 Reference

Date: 2022-01-10 Mon 00:00

Author: Younghwan Nam

Created: 2024-05-02 Thu 03:16

Emacs 27.2 (Org mode 9.4.4)

Validate