Git Hooks, lint로 코드스타일 통일

fobidlim
3 min readJun 9, 2020

--

Git Hooks를 적용해야 하는 팀

1. 팀 단위 프로젝트에서 작업자(개발자)마다 코드 스타일이 다르다.

2. Coding Conventions(코딩 컨벤션, 코딩 규칙)을 문서화 했지만, 모든 규칙을 한번에 외우기에도 어렵고, 사람의 습관은 쉽게 변하지 않는다.

나와 함께 일하는 동료와 한 팀으로 만나기 이전에 각자 다른 회사에서, 다른 프로젝트에서 자연스럽게 익힌 습관이 있고, 이 습관은 누구에게나 동일하게 적용될 수 없습니다.

따라서, 누구의 말이 옳고 그른지는 정해진 것이 없습니다.

이견이 조율되는 것은 좋은 그림일지라도 역시나 사람의 습관은 쉽게 변하지 않습니다.

공동의 이익을 위해 때로는 강제화 할 필요도 있다고 생각합니다.

Git Hooks는 Client-Side, Server-Side 두 종류가 있습니다.

대부분 개발자는 Git 서버를 직접 설치해서 사용하기보다 GitHub, BitBucket, GitLab 등의 클라우드 서비스를 사용할테니, Client-Side Git Hooks에 대해 다뤄봅니다.

pre-commit 훅은 커밋할 때 가장 먼저 호출되는 훅으로 커밋 메시지를 작성하기 전에 호출된다.

prepare-commit-msg 훅은 Git이 커밋 메시지를 생성하고 나서 편집기를 실행하기 전에 실행된다.

commit-msg 훅은 커밋 메시지가 들어 있는 임시 파일의 경로를 아규먼트로 받는다.

pre-rebase 훅은 Rebase 하기 전에 실행된다.

post-rewrite 훅은 커밋을 변경하는 명령을 실행했을 때 실행된다.

pre-commit 훅으로 팀의 코딩 컨벤션을 맞추기 위해 lint를 강제하려고 합니다.

lint에 통과하지 못하면 커밋할 수 없으니 프로젝트에 코드를 넣을 수 없도록 말입니다.

.git/hooks 위치로 이동합니다.

.sample 이라는 확장자가 붙은 파일이 여러개 있습니다.

pre-commit.sample 파일의 확장자만 지우면 바로 훅을 사용할 수 있지만, 말 그대로 샘플일 뿐이니 제가 바라는 lint는 실행되지 않을 것입니다.

pre-commit 새 파일을 만들고 lint 쉘 스크립트를 작성합니다.

준비 완료.

프로젝트의 파일을 수정하고 커밋하려고 한다면, lint가 선행됩니다.

lint 검사가 통과된 후 커밋이 정상적으로 될테고, 검사에 통과하지 못하면 커밋이 되지 않습니다.

하지만 한가지 아쉬운점이 있다면, 위에서 만든 pre-commit 파일은 로컬 설정이기 때문에, 프로젝트 내 작업자 모두 동일한 파일이 로컬에 있어야만 기대하는 효과를 볼 수 있습니다.

프로젝트 경로를 Git Hooks 경로로 만들 순 없을까?

있습니다.

프로젝트에서 새로운 폴더를 생성합니다.

저는 임의로 .githooks 폴더를 생성하겠습니다.

새로 생성한 폴더의 하위로 위에서 만든 pre-commit 파일을 이동하고 아래 명령어를 실행합니다.

git config core.hooksPath .githooks(새로 생성한 폴더 경로)

아래 명령어로 hooksPath가 새로 설정한 .githooks를 가르킨다면 성공입니다.

git config --get core.hooksPath

드디어 core.hooksPath 설정으로 모두가 동일한 pre-commit 을 사용할 수 있게 되었습니다.

이제 여러분은 PR에서 코드 스타일에 대한 리뷰 시간을 아낄 수 있을 것입니다.

--

--