본문으로 바로가기

[GIT] Hook : post-receive, pre-receive

category Helloworld!/GIT 2016. 8. 18. 14:27
Git Hook 에는 클라이언트 Hook 과 서버 Hook 이 있다.
클라언트 Hook 은 Commit 이나 Merge 할 때 실행되고 서버 Hook 은 Push 할 때 서버에서 실행한다.

Hook 은 Git 디렉토리 밑에 hooks 라는 디렉토리에 저장된다.
기본 : .git/hooks
이 디렉토리에 가보면 Git이 자동으로 넣어준 스크립트가 있다.
(몇개의 예제 스크립트를 열어보면 사용방법도 알 수 있다. 예제는 .sample 이라는 확장자가 붙어있다)

이중에서 pre-receive 와 post-repceive에 설명하고자 한다.

Push 하면 가장 처음으로 실행되는 Hook은 pre-receive 이다.
이 스크립트는 표준입력(STDIN)으로 Push 하는 레퍼런스의 목록을 입력받는다.

반대로, post-receive는 Push 한 후 실행된다.
pre-receive와 마찬가지로 표준 입력(STDIN)으로 레퍼런스 목록이 넘어간다.
여기서 다음 과같이 GIT_WORK_TREE
checkout 시 develop 이라는 브런치로 하라는 스크립트를 작성해놓으면 Push 시, develop 브런치에 있는 코드로 적용된다.
참고로 브런치명을 입력안한 기본값은 master 브런치이다.
GIT_WORK_TREE=/www/dir/web git checkout develop -f

Git 공식 홈페이지 설명
(https://git-scm.com/book/ko/v1/Git%EB%A7%9E%EC%B6%A4-Git-%ED%9B%85)
pre-receive와 post-receive
Push하면 가장 처음 실행되는 훅은 pre-receive 훅이다. 이 스크립트는 표준 입력(STDIN)으로 Push하는 레퍼런스의 목록을 입력받는다. 0이 아닌 값을 반환하면 해당 레퍼런스가 전부 거절된다. Fast-forward Push가 아니면 거절하거나, 브랜치 Push 권한을 제어하려면 이 훅에서 하는 것이 좋다. 관리자만 브랜치를 새로 Push하고 삭제할 수 있고 일반 개발자는 수정사항만 Push할 수 있게 할 수 있다.

post-receive 훅은 Push한 후에 실행된다. 이 훅으로 사용자나 서비스에 알림 메시지를 보낼 수 있다. 그리고 pre-receive 훅처럼 표준 입력(STDIN)으로 레퍼런스 목록이 넘어간다. 이 훅으로 메일링리스트에 메일을 보내거나, CI(Continuous Integration) 서버나 Ticket-tracking 시스템의 정보를 수정할 수 있다. 심지어 커밋 메시지도 파싱할 수 있기 때문에 이 훅으로 Ticket을 만들고, 수정하고, 닫을 수 있다. 이 스크립트가 완전히 종료할 때까지 클라이언트와의 연결은 유지되고 Push를 중단시킬 수 없다. 그래서 이 스크립트로 시간이 오래 걸릴만한 일을 할 때는 조심해야 한다.