GitHook 기능을 이용하면 commit되기 전에 자동으로 소스 파일을 검사하거나 메세지를 추가 할 수 있다.

Git 커밋시 간단한 메세지를 자동으로 추가해보자.

저장소 생성

먼저 git 저장소를 생성한다.

$ mkdir repo
$ cd repo
$ git init
Initialized empty Git repository in /repo/.git/

Hook 예제

.git/hooks 디렉토리에 hooks 예제 파일들이 있다.

$ cd .git/hooks
$ ls -1 .git/hooks
applypatch-msg.sample
commit-msg.sample
fsmonitor-watchman.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-merge-commit.sample
pre-push.sample
pre-rebase.sample
pre-receive.sample
prepare-commit-msg.sample
push-to-checkout.sample
update.sample

Hooks

Commit message 수정이 목적이니 관련 hook만 살펴보자.

  • pre-commit (–no-verify)
    • commit 전에 검사를 수행하기 위한 hook
  • pre-merge-commit (–no-verify)
    • merge 실행 뒤 commit 실행 전에 호출되는 hook
  • prepare-commit-msg
    • 기본 commit 메세지가 준비된 뒤 에디터 편집 전에 호출되는 hook
  • commit-msg (–no-verify)
    • commit 메세지를 형식에 맞게 정규화 하고 commit을 거부하기 위한 hook
  • post-commit
    • commit 메세지가 생성된 뒤 알림용 hook

–no-verify가 표시된 hook은 해당 옵션이 있으면 실행되지 않는다.

메세지 추가

prepare-commit-msg 파일을 편집해 파일목록에 날짜와 메세지를 출력하는 hook을 작성해보자.

예제 스크립트는 Commit message의 경로를 전달하는 첫번째 파라미터($1)를 변수 COMMIT_MSG_FILE에 저장하고 기본 메세지 Please enter the commit message를 삭제한다.

$ cat prepare-commit-msg.sample
...
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3

/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
...

먼저 예제 파일 prepapre-commit-msg.sampleprepapre-commit-msg 로 복사한다.

$ cp prepare-commit-msg.sample prepare-commit-msg

prepare-commit-msg 파일의 perl 라인 뒤에 아래 명령어를 추가하면 날짜와 Awesome 메세지가 출력된다.

sed -i "1i `date +%Y-%m-%d` Awesome `git diff --cached --name-only -r`" "$COMMIT_MSG_FILE"

Commit

변경한 hook과 함께 실제 커밋을 해보자.

$ touch foo
$ git add foo
$ git commit -a

메세지에 날짜와 메세지가 출력된다.

2022-09-10 Awesome foo

# On branch master
# Changes to be committed:
#       new file:   foo
#

여기서는 단일 파일을 커밋했지만 다수 파일을 커밋할 경우 스크립트에서 처리해주면 된다.

주의할 점은 자동으로 생성된 메세지에 내용이 있으면 자동으로 커밋 된다.

메세지 편집 도중에 취소하고 싶은 경우 내용을 주석처리하고 저장하면 된다.

참조

https://git-scm.com/docs/githooks