Git Hooks
Git에는 commit, merge, push 등 어떤 이벤트가 발생했을 때
자동으로 특정 스크립트를 실행하는 Git Hooks라는 기능이 있습니다.
Git 저장소에 기본적으로 존재하는 .git 디렉토리 내부에 hooks라는 디렉토리가 존재하는데,
해당 디렉토리 안에는 아래와 같이 이벤트 종류별로 스크립트 예제가 존재합니다.
$ ls .git/hooks
applypatch-msg.sample prepare-commit-msg.sample
commit-msg.sample pre-push.sample
fsmonitor-watchman.sample pre-rebase.sample
post-update.sample pre-receive.sample
pre-applypatch.sample push-to-checkout.sample
pre-commit.sample update.sample
pre-merge-commit.sample
Shell
복사
여기서는 commit할 때 자동으로 코드 스타일을 검사해 주는 것이 목표이기에,
커밋 메시지가 작성되기 전에 호출되는 pre-commit 훅을 사용할 것입니다.
pre-commit
역시나 이번에도 업계 선배님들께서 앞서 길을 번지르르하게 닦아 놓으셨습니다!
훅 이름과 동일한 pre-commit이라는 유용한 도구가 이미 개발되어 있으므로,
우리는 감사한 마음을 가지고 사용하는 일만 남았습니다.
Installation
코드 스타일 검사에 이용할 코드 포매터는 각자 원하는 것을 사용하면 됩니다.
여기서는 clang-format을 사용하는 경우를 기준으로 진행해 보도록 하겠습니다.
macOS:
$ brew install pre-commit
$ brew install clang-format
Shell
복사
Linux:
$ sudo apt-get update
$ sudo apt-get install -y pre-commit
$ sudo apt-get install -y clang-format
Shell
복사
Python이 설치되어 있는 경우 아래와 같이 pip로도 설치할 수 있습니다.
$ pip install pre-commit
$ pip install clang-format
Shell
복사
성공적으로 설치가 완료되었다면, 아래 명령어를 통해 버전을 확인할 수 있습니다.
$ pre-commit --version
pre-commit 3.1.0
Shell
복사
Configuration
이제 .pre-commit-config.yaml이라는 이름의 설정 파일이 필요한데,
다음은 clang-format을 Google 스타일로 실행하도록 하는 설정 파일입니다.
repos:
- repo: https://github.com/bmorcos/pre-commit-hooks-cpp
rev: master
hooks:
- id: clang-format
args: [--style=Google]
Shell
복사
Usage
설정 파일까지 준비가 완료되었다면,
pre-commit run 명령어를 통해 설정한 훅이 올바르게 동작하는지 확인할 수 있습니다.
$ pre-commit run
# 검사 대상 파일이 없는 경우
clang-format.........................................(no files to check)Skipped
# 검사를 통과한 경우 (알맞게 포매팅되어 있는 경우)
clang-format.............................................................Passed
# 검사를 통과하지 못한 경우
clang-format.............................................................Failed
Shell
복사
Git 저장소에서 pre-commit install 명령어를 사용하면,
.git/hooks 디렉토리 내부에 pre-commit 스크립트를 설치해 줍니다.
설치 후에도 설정 파일은 필요하기 때문에,
설정 파일을 GitHub에 push하고 싶지 않다면 .gitignore에 추가해 주시면 됩니다.
$ echo .pre-commit-config.yml >> .gitignore
Shell
복사
이제 커밋할 때마다 해당 스크립트가 실행되어,
모든 대상 파일이 알맞게 포매팅되어 있으면 정상적으로 커밋이 진행되고
그렇지 않으면 해당 파일을 지정한 스타일대로 포매팅하며 커밋이 실패하게 됩니다!