git hook

Git 디렉토리 밑에 hooks라는 디렉토리에 저장한다. 기본 훅 디렉토리는 .git/hooks이다. 이 디렉토리에 가보면 Git이 자동으로 넣어준 매우 유용한 스크립트 예제가 몇 개 있다. 그리고 스크립트가 입력받는 값이 어떤 값인지 파일 안에 자세히 설명돼 있다. 모든 예제는 쉘과 Perl 스크립트로 작성돼 있지만 실행할 수만 있으면 되고 Ruby나 Python같은 다른 스크립트 언어로 만들어도 된다.예제 스크립트의 파일 이름에는 .sample이라는 확장자가 붙어 있다. 그래서 이름만 바꿔주면 그 훅을 사용할 수 있다

참조 :https://git-scm.com/book/ko/v1/Git%EB%A7%9E%EC%B6%A4-Git-%ED%9B%85

  • git hook에 대한 설명 만으로는 무엇을 할 수 있는지 감이 안올 수 있습니다.
  • hook이라는 용어에서 알 수 있듯 git 작업에 후킹 메소드를 걸어 두고 이 메소드의 동작을 정의하면 자연스럽게 동작됩니다.
  • 예를 들어 push 후 slack 이나 기타 메신저로 동료에게 알림 을 걸어 준다거나 commit 전/후 unit test 실행하여 성공할 경우만 commit 하고 싶을 때! 이 때 적합한게 git hook이라 할 수 있습니다.

  • git에서 기본적으로 정의된 sample hook
$ cd .git/hook/
$ ls
applypatch-msg.sample     pre-applypatch.sample     pre-rebase.sample
commit-msg.sample         pre-commit.sample         prepare-commit-msg.sample
post-update.sample        pre-push.sample           update.sample
  • hook을 적용하기 위해서는 pre-commit.sample -> pre-commit 파일 명에 sample을 지워주시면 됩니다.
  • hook 은 기본적으로 쉘 스크립트로 구성되어 있는데 다른 스크립트 언어를 쓰실 수도 있습니다.

  • 저의 경우 unit test 를 성실하게 실행하지 않아 빌드 서버에서 빌드 결과로 unit test fail을 자주 만나는데 이럴 때 참.. 민망한 순간입니다. Unit Test가 자연스럽게 개발 과정에 녹아들어야 하는데…
  • 그래서 저는 push 전 자동 maven test를 실행하는 hook으로 설정했습니다.
echo "mvn test befero push"

CWD=`pwd`
MAIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $MAIN_DIR
cd $MAIN_DIR/../../
MVN_RESULT=$(mvn clean test 2>&1)
    if [ $? -ne 0 ]; then
    echo
    echo "${MVN_RESULT}" | ((tee /dev/fd/5 | grep -A 10 -B 2 "Reactor Summary:" >/dev/fd/4) 5>&1 | sed -n -e '/^Failed tests:/,/Tests run:.*$/ p' ) 4>&1
    echo
    echo "Error while testing the code"
    # go back to current working dir
    cd $CWD
    exit 1
fi
cd $CWD

thswave

try hard, try hard!