Hook 과 signing 이 의도를 강제로
Git hook 은 .git/hooks/ 의 스크립트로 lifecycle 이벤트에 발화: before-commit, after-commit, before-push, before-receive 등. 팀에 중요한 건 두 카테고리. Client-side hook (pre-commit, commit-msg, pre-push) 은 개발자 머신에서 실행, 노트북 떠나기 전 문제 잡음 — 포맷팅, 린팅, 금지 문자열 탐지, 기본 test 실행. Server-side hook (pre-receive, update) 은 서버에서 실행, 정책 위반 push 거부 — 마지막 방어선이고 부주의한 contributor 가 우회할 수 없는 유일한 거.
오늘날 실용적 client-side 스택: pre-commit (Python 도구, hook 이름 아님) 또는 Husky (Node 생태계) 가 YAML 이나 package.json 에서 hook 을 선언적 구성. Hook config 가 formatter (Prettier, Black), linter (ESLint, Ruff), 커스텀 체크 (no console.log, production 코드에 no TODO, secret 스캔) 실행. 각 push 가 위반을 일찍 — 고치기 싼 시점 — 표면화, CI 가 분 단위 후 돌리는 게 아니라.
Commit signing 이 두 번째 보강 layer. git commit -S (또는 commit.gpgsign = true) 로 Git 이 GPG 또는 SSH key 로 commit 서명. GitHub 의 'Verified' 배지가 서명이 author 에 등록된 key 와 일치 확인. 사칭 차단: 개발자 계정 비밀번호 훔친 attacker 가 signing key 는 못 가져갔으면 signed commit 요구하는 branch 보호 통과 못 함. SSH commit signing (Git 2.34+) 이 GPG 보다 쉽고 SSH push 에 이미 쓰는 같은 key 로 작동.
한 번 설정. git config --global commit.gpgsign true 로 모든 commit 서명. git config --global gpg.format ssh 로 GPG 대신 SSH key 사용. git config --global user.signingkey ~/.ssh/id_ed25519.pub 로 key 선택. Branch 보호 룰 'Require signed commits' 가 서명 없는 push 거부. Hook 강제 형식 + 내용 룰과 결합하면 팀 표준이 신중한 사람 의존이 아니라 도구에 인코딩됨.