허스키를 깔아도 커밋이 그냥 나가면 훅 파일이 저장소에 없는 것이다. 허스키는 준비 스크립트가 훅 자리를 만들고, 레프트훅은 설정 파일과 설치 한 줄이다. 피엔피엠은 빌트 의존에 없으면 설치 후 스크립트를 건너뛴다. 개발자, 오픈소스, 깃허브, Next.js, 프론트엔드, 린트, API, 데브옵스 기준으로 로컬 훅 칸만 보고 시크릿 글, 액션 동시성 글과 자리를 섞지 않는다. 2026년 8월 공식 문서.
허스키를 깔았는데도 커밋이 그냥 나갑니다. 패키지는 있고 훅 파일은 없습니다. 허스키는 준비 스크립트가 한 번 돌아야 훅 자리를 만들고, 레프트훅은 설치 한 줄이 설정 파일을 그 자리에 연결합니다. 피엔피엠은 빌트 의존 목록에 없으면 설치 후 스크립트를 건너뜁니다.
저는 12개 사이트를 클론한 뒤, 린트 없이 커밋이 나간 날이 있습니다. 원인은 패키지 목록에 허스키가 있고 훅 폴더가 비어 있던 것이었습니다. 시크릿이 커밋에 붙는 칸은 시크릿 체크 글, 테스트 스크립트는 노드 테스트 글입니다. 여기는 커밋 전에 로컬에서 도는 훅 칸만 봅니다.
깃은 훅을 패키지 목록에서 찾지 않습니다. .git/hooks 자리, 또는 훅 경로 설정이 가리키는 파일만 실행합니다.
패키지에 허스키가 있어도 클론 직후 그 자리는 샘플 파일뿐입니다. 샘플은 실행 비트가 꺼져 있고, 이름 끝에 샘플이 붙어 있습니다. 커밋은 그 파일을 안 탑니다. 허스키는 준비 스크립트가 훅 경로를 자기 폴더로 바꾸고, 레프트훅은 설치 명령이 같은 일을 합니다. 둘 다 안 돌면 린트는 로컬에서 침묵합니다.
액션에서 도는 검사와 자리를 섞지 않습니다. 액션 동시성은 동시성 글입니다. 의존성 봇은 디펜더봇 글입니다. 오늘은 내 맥에서 커밋을 누르기 전 칸만 봅니다.
칸
누가 넣나
저장소에 남나
클론 직후
.git/hooks 샘플
깃 초기화
안 남음
실행 안 함
허스키 패키지
준비 스크립트
패키지 목록만
준비가 돌아야 훅 자리
레프트훅 설정
설치 한 줄
설정 파일은 남음
설치가 돌아야 훅 자리
액션 검사
푸시 뒤 잡
워크플로 파일
로컬 커밋과 무관
계정 메일이 찍히는 칸은 includeIf 글입니다. 그 글은 폴더별 이메일입니다. 훅이 도는지와 메일이 누구인지는 별개입니다.
패키지 설치만으로는 훅이 안 붙습니다 | 깃은 훅 경로의 파일만 실행합니다. 준비 스크립트나 설치 한 줄이 그 경로를 채우기 전에는 커밋이 그냥 나갑니다.
허스키는 준비 스크립트가 훅 자리를 만든다
허스키 시작 문서는 패키지를 넣은 뒤 초기화 명령을 한 번 돌리라고 적습니다. 그 명령이 훅 폴더에 커밋 전 파일을 만들고, 패키지 파일의 준비 스크립트를 허스키로 고칩니다.
이후 클론에서는 패키지 설치가 준비 스크립트를 돌립니다. 엔피엠 문서는 준비가 로컬 설치와 팩, 배포 전에 돈다고 적습니다. 개발 의존을 빼고 설치하면 허스키 바이너리가 없어서 그 줄이 실패합니다. 시아이에서 프로덕션 설치만 하면 로컬과 다른 그림이 됩니다.
예전 허스키 4는 패키지 파일 안에 훅 맵을 적었습니다. 지금 초기화는 그 맵을 안 읽습니다. 저장소에 옛 키가 남아 있으면 화면은 설치된 것처럼 보여도 커밋 전 파일은 없습니다. 저는 테크 폴더에서 그 옛 키만 보고 안심했다가, 린트 없이 푸시한 적이 있습니다.
허스키 패키지, 초기화, 커밋 전 파일 한 줄
# https://typicode.github.io/husky/get-started.html
npm install --save-dev husky
npx husky init
# 초기화가 만든 .husky/pre-commit 예
npm test
# 한 번만 건너뛸 때. 기본으로 쓰지 않는다
# HUSKY=0 git commit
허스키 4 훅 맵은 지금 초기화가 안 읽습니다 | 패키지 파일의 husky.hooks 칸은 옛 형식입니다. 훅 폴더의 커밋 전 파일이 있는지를 먼저 봅니다.
깃은 패키지 목록이 아니라 훅 경로의 파일만 실행한다
레프트훅은 설정 파일 하나와 설치 한 줄이다
레프트훅 문서는 설정 파일을 만들고 설치를 돌리라고 적습니다. 설치가 깃 훅 자리를 채우고, 커밋이 들어오면 그 설정만 읽습니다.
설정 파일 이름은 lefthook.yml 이 기본입니다. 숨김 이름과 설정 폴더 아래 이름도 받습니다. 커밋 전 칸에 병렬을 켜면 명령이 같이 돕니다. 기본은 한 줄씩입니다. 글롭으로 확장자를 가리고, 스테이지만 넣으려면 명령에 {staged_files} 자리를 둡니다. 린트가 고친 파일을 다시 올리려면 stage_fixed 를 켭니다.
바이너리는 고로 되어 있습니다. 노드 런타임이 없어도 훅 관리자는 돕니다. 넥스트 앱이면 린트 명령은 여전히 노드를 부릅니다. 린트 도구 자체는 바이옴 글입니다. 파이썬 타입 칸은 타입체크 글입니다. 오늘은 그 명령을 커밋 전에 물리는 자리만 봅니다.
레프트훅 엔피엠 문서는 피엔피엠에서 설치 후 스크립트가 안 돌 수 있다고 적습니다. 빌트 의존 목록에 레프트훅이 없으면 훅이 안 붙습니다.
저는 형제 사이트를 피엔피엠으로 받은 뒤, 커밋이 또 그냥 나갔습니다. 패키지는 있었고 훅 경로는 비어 있었습니다. 워크스페이스 파일의 빌트 의존과 루트 패키지 파일의 같은 칸에 레프트훅을 넣었습니다. 그다음 설치를 다시 돌리니 훅 자리가 생겼습니다. 한글 경로 작업/회사 아래에서도 훅 경로는 저장소 루트 기준입니다.
홈브류로 바이너리만 받아도 됩니다. 맥 초기 도구 목록은 맥 셋업 글입니다. 그 글은 홈브류 순서입니다. 저장소마다 설정 파일을 공유하려면 패키지로 넣고, 설치 후 스크립트가 도는지 한 번 확인합니다. 셸 값이 옆 폴더에 남는 칸은 디렉브 글입니다. 훅 경로와 셸 변수는 별개입니다.
피엔피엠은 빌트 의존에 레프트훅을 적는다
# https://lefthook.dev/installation/node/
pnpm add -D lefthook
# package.json 의 pnpm.onlyBuiltDependencies
# 또는 pnpm-workspace.yaml 의 onlyBuiltDependencies
# 없으면 postinstall 이 안 돌아 훅이 안 붙는다
# 설치 후 스크립트를 건너뛴 창에서는 한 번 직접
npx lefthook install
설정 파일은 커밋하고, 훅 자리는 설치 한 줄이 채운다
스테이지만 돌릴 때 허스키는 린트스테이지가 한 칸 더 있다
허스키 커밋 전 파일은 셸 스크립트입니다. 스테이지만 고르려면 린트스테이지(lint-staged)를 한 칸 더 둡니다. 레프트훅은 글롭과 {staged_files} 자리가 설정 안에 있습니다.
전체 린트를 커밋마다 돌리면 형제 사이트처럼 파일이 많은 저장소에서 커밋이 멈춥니다. 문의 페이지 한 줄만 고쳤는데 관리자 목록까지 검사하면 분이 갑니다. 스테이지만 넣고, 전체 검사는 액션에 둡니다. 액션이 같은 브랜치에서 겹치는 칸은 동시성 글입니다.
로컬만 건너뛰고 푸시하는 습관은 시크릿 글과 겹칩니다. 훅이 키 파일을 막아주던 저장소에서 검증 없음을 상시로 켜면, 그 칸이 사라집니다. 한 번만 건너뛸 때는 레프트훅은 환경 변수 영, 허스키는 허스키 영입니다. 깃의 검증 없음은 커밋 전과 커밋 메시지 훅을 함께 뺍니다.
로컬만 한 번 건너뛰기, 검증 없음은 훅 전체를 뺀다
# https://lefthook.dev/usage/
LEFTHOOK=0 git commit -m "wip local skip"
# 허스키 시작 문서의 건너뛰기
HUSKY=0 git commit -m "wip local skip"
# 커밋 전과 커밋 메시지를 함께 뺀다. 상시로 쓰지 않는다
# git commit --no-verify
허스키와 레프트훅을 한 저장소에 같이 두지 않습니다 | 둘 다 훅 경로를 자기 쪽으로 바꿉니다. 나중에 설치한 쪽이 이깁니다. 옮길 때는 준비 줄과 훅 폴더를 지우고 설치를 한 쪽만 남깁니다.
오늘 설정 파일 하나와 설치 한 번만 넣는다
오늘 할 일은 지금 쓰는 사이트 루트에 설정 파일을 하나 두는 일입니다. 커밋 전에 자바스크립트 스테이지만 린트하고, 설치를 한 번 돌립니다. 공백 한 줄을 고친 뒤 커밋을 눌러 린트가 도는지 봅니다.
저는 테크부터 넣었습니다. 허스키 준비 줄은 지웠습니다. 피엔피엠 목록에 빌트 의존을 적고 설치를 다시 돌렸습니다. 로컬만 바꿀 명령은 로컬 설정 파일에 두고 깃이그노어에 넣습니다. 레프트훅 문서는 그 파일이 본 설정을 덮는다고 적습니다.
노드가 홈 폴더를 여는 칸은 노드 권한 글입니다. 값은 디렉브 글, 열 수 있는 경로는 그 글, 커밋 전 명령은 여기입니다.
로컬만 덮는 파일은 깃이그노어, 본 설정은 커밋
# https://lefthook.dev/examples/lefthook-local/
# lefthook-local.yml 은 깃이그노어
pre-commit:
commands:
lint:
skip: true
# 본 설정 lefthook.yml 은 커밋한다
# npx lefthook dump 로 합쳐진 설정을 확인
공백 한 줄로 훅이 도는지 확인한 뒤 형제 사이트에 같은 파일을 둔다
오늘 한 줄 | 패키지만 있으면 커밋은 그냥 나갑니다. 설정 파일을 커밋하고 설치를 한 번 돌린 뒤, 공백 커밋으로 훅이 도는지 봅니다.