훅 디렉터리


깃의 저장소(.git) 디렉터리 안에는 내부적인 깃 파일들이 있습니다. .git 디렉터리안에 hook 디렉터리를 확인할 수 있습니다. 이 폴더 안에 스크립트 파일을 작성하여 넣어 두면 훅 기능이 동작하게 됩니다.


스크립트 파일


훅은 스크립트를 실행합니다. 스크립트는 다양한 언어로 제작이 가능합니다. 셸 스크립트, 펄 스크립트 등입니다. 심지어 PHP, 루비, 파이썬과 같은 인터프리터 언어를 이용하여 작성할 수도 있습니다.

스크립트를 작성할 때는 파일 상단에 작성한 언어를 적어주어야 합니다. 예를 들어 #!/bin/bash 또는 #!/user/bin/perl과 같은 라인이 추가되어야 합니다.


예제 파일


깃은 쉽게 훅 기능을 사용하고, 코드를 작성할 수 있도록 예제 파일을 제공합니다.

infoh@DESKTOP-VAKLOFQ MINGW64 /e/githooks (master)
$ ls .git/hooks/
applypatch-msg.sample*      
pre-applypatch.sample*      
pre-rebase.sample*
commit-msg.sample*          
pre-commit.sample*          
pre-receive.sample*
fsmonitor-watchman.sample*  
prepare-commit-msg.sample*  
update.sample*
post-update.sample*         
pre-push.sample*

예제 파일은 .sample 확장자가 붙어 있습니다. 예제 파일은 깃의 template 디렉터리를 기반으로 복제됩니다.


실행 파일


훅의 스크립트 파일이 실행되기 위해서는 파일의 상태가 실행으로 설정되어야 합니다.
특히 리눅스나 macOS 같은 운영 체제는 파일의 실행 여부를 설정할 수 있습니다.

$ chmode a+x .git/hooks/스트립트

실행 비트를 설정하면 스크립트를 실행 가능한 상태로 변경할 수 있습니다.
깃 배시에서 실행 파일은 녹색으로 표시됩니다.

윈도우 운영 체제의 경우 기본적으로 실행 가능한 파일로 설정됩니다.


훅 복사


훅 디렉터리는 자동으로 복사되지 않습니다.

깃의 clone 명령어는 저장소를 복사하는 동작입니다. 따라서 저장소를 clone하면 모든 히스토리와 파일들이 복제되어야 합니다. 하지만 .git/hook 폴더는 clone으로도 자동 복제되지 않습니다. 또한 fetch 명령어로도 훅의 파일은 전송되지 않습니다.

이는 저장소의 보안을 위해서입니다.

훅 파일을 배포하기 위해서는 별도의 파일로 만들어 따로 배포해야 합니다.


독립성


훅 스크립트는 설정된 저장소에만 동작합니다. 훅 스크립트는 자동 복사되지 않습니다. 만일 여러 개의 저장소를 이용하고 있다면 각 저장소마다 훅 스크립트를 복사해야 합니다.

로컬 저장소에 훅 파일이 있다면, 로컬에서만 동작합니다. 원격 저장소에 있는 훅은 원격 저장소에서만 동작합니다.