들어가며…

안녕하세요. 우아한형제들 CTO실 주문시스템개발팀의 라태웅입니다.

요새 Git은 어느 조직이건 개인이건 많이 사용하고 계신데요, 굉장히 많은 기능이 있죠. 이중 몰라도 큰 상관은 없지만 좀 더 편리하게 Git을 사용할 수 있도록 도와주는 기능인 Git Hook에 대한 소개드리려고 합니다.

Git Hooks

여러분은 낚이고 계신겁니다(?)

Git은 특정 상황에 특정 스크립트를 실행할 수 있도록 하는 Hook이라는 기능을 지원하고 있습니다. 따로 무언가를 설치할 필요는 없고, 모든 git repository에서 이미 지원이 되고 있는데요.

터미널로 아무 repository나 접근해서 cd .git/hooks/를 해봅니다.

Git Hooks List

.sample 확장자로 된 파일이 많죠?

목록을 보시면 .sample 확장자로 되어 있는 파일이 10개 있는데요! 이게 Git에서 지원하는 Hook의 전부랍니다! 몇개 없죠?

방금 설명드렸듯이, Git Hook의 정의는 특정 상황에 특정 스크립트를 실행하는 것이고, 따라서 Git Hook이 지원하는 특정 상황은 10개인 것을 알 수 있습니다.

각 스크립트가 어느 상황에서 실행되는지에 대한 자세한 설명은 이곳을 참고해주세요!

.sample 이라는 확장자를 지우면 각 상황에 샘플이 바로 적용됩니다!

이 글에서는 pre-commit(단어 뜻 그대로 커밋 직전에 실행되는 Hook 이랍니다!)이라는 Hook을 통해 커밋 전 이미지를 자동으로 압축하는 스크립트를 작성해보려고 하는데요. 이를 통해 Git Hook을 잘 쓰면 정말 편하겠구나! 좋은 기능이구나! 하는 생각이 드셨으면, 그리고 적용해보셨으면, 공유해주셨으면! 하는 바람입니다!

아쉽게도 이 글은 Mac 전용으로 작성되었습니다. Git Hook에 대한 내용은 플랫폼에 관계없이 동일합니다!

시작해볼까요?!

먼저 이미지 압축 유틸리티인 ImageOptim를 다운로드 받은 뒤, Application 폴더에 넣습니다. (ImageOptimCLI의 기본 참조 경로가 Application이기 때문)

그 다음, shell script에서 ImageOptim을 쓸 수 있도록 ImageOptimCLI를 설치하고, PATH를 잡아줍니다.

mkdir ~/.woowa

curl --output ~/.woowa/imageoptim-cli.zip https://codeload.github.com/JamieMason/ImageOptim-CLI/zip/1.15.1
unzip ~/.woowa/imageoptim-cli.zip -d ~/.woowa/tmp
mv ~/.woowa/tmp/ImageOptim-CLI-1.15.1 ~/.woowa/imageoptim-cli
rm -rf ~/.woowa/tmp

export PATH=$PATH:~/.woowa/imageoptim-cli/bin

위에서 .sample 확장자를 지우면 샘플이 바로 적용된다고 말씀드렸었죠?

그렇습니다. Git Hook을 적용하려면 ‘OS가 실행가능한 파일을 .git/hooks/ 디렉토리에 파일명을 맞춰서 넣어주면’ 됩니다. 정말 쉽죠?

이 글에서는 pre-commit Hook을 적용할 것이기 때문에 .git/hooks/pre-commit 파일을 만들어주면 되겠죠!

vi SOME_GIT_REPOSITORY/.git/hooks/pre-commit

pre-commit 파일을 생성한 뒤, 아래의 내용을 적도록 합니다.

#!/bin/sh

# git diff --exit-code --cached --name-only --diff-filter=ACM -- '*.png' '*.jpg'
# 위의 명령어는 현재 add 되어있는 파일 중, .png와 .jpg 확장자를 가진 파일들을 '이름만' 추출합니다.
images=$(git diff --exit-code --cached --name-only --diff-filter=ACM -- '*.png' '*.jpg')

# 추출된 이미지 파일들을 ImageOptimCLI에 넘겨주기만 하면 되는 것이죠!
# 이미지들이 압축되어 변경되었으니 다시 add 해줘야겠죠?
$(exit $?) || (echo "$images" | ~/.woowa/imageoptim-cli/bin/imageOptim && git add $images)

끝입니다.

정말로요.

정말 쉽죠?

진짜 되는지 해볼까요?

Git Hooks List

이미지 파일을 추가한 뒤 commit 했더니 자동으로 ImageOptim이 실행되어 압축이 진행되는 모습

Git Hooks List

얼마나 압축되었는지도 친절하게 알려준답니다!

이렇게 적용하기 쉬운 Git Hook, 언제까지 수동으로 압축하실건가요! (그러다 까먹고)

마치며…

짧고 간단하지만 강력하고 깊이 파고들면 훅 하고 낚이는 Git Hook! 지금 바로 커밋 전 귀찮은 작업을 해주거나 실수한 것들을 자동으로 체크해주는 Hook을 적용해보시는 것은 어떨까요?

감사합니다!