티스토리 뷰

Daylogs/Git

Git: Git hooks 적용하기

ohgyun 2016. 3. 14. 00:02
발생일: 2014.02.18

키워드: git hooks, 깃훅

문제:
프로젝트에 커밋하거나 푸시하기 전에 린트나 테스트를 돌리려고 한다.
깃훅(git hooks)이 있다고 들었는데, 어떻게 적용하면 될까?


해결책:

## Git hooks 적용하기

프로젝트의 .git/hooks 디렉토리에 들어가면 아래 이미지와 같이 샘플 훅 파일이 있다.


각 파일은 이름에 적혀있는 시점에 실행되는 훅 파일의 샘플이다.
예를 들어, pre-commit 은 커밋 전에, pre-push 는 푸시 전에 호출된다.

실제로 훅이 동작하게 하려면, 해당 파일을 열어 수정한 후에 .sample 확장자를 제거하면 된다.
샘플 파일을 그대로 두고 싶다면, 별도의 훅 파일을 만들어 아래처럼 실행 가능하게 만들면 된다.

$ touch .git/hooks/pre-commit
$ chmod +x .git/hooks/pre-commit 


훅 파일이 정상 종료되지 않으면 해당 깃 액션도 취소된다.
예를 들어, 특정 명령이 올바르게 종료되지 않았을 때 커밋을 취소하려면,
아래와 같이 작성하면 된다.

<pre-commit>
#!/bin/sh
grunt jshint # 우리 프로젝트에서는 커밋 전에 grunt 로 린트를 돌리도록 적용했다.
if [ $? -ne 0 ]; then
  echo "Grunt failed, please fix code and recommit"
  exit 1
fi
exit 0


## 훅을 프로젝트로 공유하기

.git 디렉토리는 기본적으로 git ignore 대상이기 때문에,
훅 파일도 리파지터리에 공유되진 않는다.

우리 프로젝트에선 별도의 디렉토리로 훅을 만들어두고,
.git/hooks 디렉토리에 심볼릭 링크를 생성하는 스크립트를 만들어 공유하는 방식으로 해결했다.

예를 들어, 아래와 같이 디렉토리를 구성해 리파지터리로 공유하고,

/githooks
  /pre-commit
  /pre-push
  /install_hooks.sh

install_hooks.sh 을 실행하면, .git/hooks/ 로 심볼릭 링크를 생성해주는 방식이다.

이 방법이 선택할 수 있는 방법 중에 가장 효율적으로 보였다.
다만, 프로젝트를 초기화할 때 스크립트 실행을 누락하는 경우가 발생할 수 있어 주의해야 한다.


덧)
이상적으론, 리파지터리를 클론할 때 훅이 바로 설치되면 가장 좋겠지만,
아쉽게도 클론 훅은 없다고 한다.

이 방법도 템플릿 파일을 미리 공유해야 해서 한계가 있어 보인다.

굳이 적용해보자면, 훅용 리파지터리를 별도로 두는 등의 방법도 있겠지만, 이 역시 --template 옵션을 누락할 수 있어,
현재로선 쉘 파일로 심볼릭 링크를 생성해주는 게 최선의 선택으로 보인다.


덧)
Git: pre-commit 훅에서 변경된 파일 확인하기


# 참고:
pre-commit 으로 grunt 빌드를 추가하는 방법에 대해 설명

pre-push hooks 에 대해 깔끔히 잘 설명되어 있는 포스트

훅을 별도의 디렉토리에 두고, 개발자가 선택적으로 실행할 수 있게 심링크를 생성하는 쉘 스크립트를 두는 아이디어 

Git 1.8.2 버전부터 pre-push 훅이 추가됐다.





반응형
댓글
공지사항