TechFeedTechFeed
Open Source

lefthook, husky, git 훅, pre-commit | 커밋은 됐는데 린트가 안 돌면?

허스키를 깔아도 커밋이 그냥 나가면 훅 파일이 저장소에 없는 것이다. 허스키는 준비 스크립트가 훅 자리를 만들고, 레프트훅은 설정 파일과 설치 한 줄이다. 피엔피엠은 빌트 의존에 없으면 설치 후 스크립트를 건너뛴다. 개발자, 오픈소스, 깃허브, Next.js, 프론트엔드, 린트, API, 데브옵스 기준으로 로컬 훅 칸만 보고 시크릿 글, 액션 동시성 글과 자리를 섞지 않는다. 2026년 8월 공식 문서.

by

허스키를 깔았는데도 커밋이 그냥 나갑니다. 패키지는 있고 훅 파일은 없습니다. 허스키는 준비 스크립트가 한 번 돌아야 훅 자리를 만들고, 레프트훅은 설치 한 줄이 설정 파일을 그 자리에 연결합니다. 피엔피엠은 빌트 의존 목록에 없으면 설치 후 스크립트를 건너뜁니다.


저는 12개 사이트를 클론한 뒤, 린트 없이 커밋이 나간 날이 있습니다. 원인은 패키지 목록에 허스키가 있고 훅 폴더가 비어 있던 것이었습니다. 시크릿이 커밋에 붙는 칸은 시크릿 체크 글, 테스트 스크립트는 노드 테스트 글입니다. 여기는 커밋 전에 로컬에서 도는 훅 칸만 봅니다.


숫자는 2026년 8월 레프트훅 문서허스키 시작 문서 기준입니다.


패키지만 있고 훅 파일이 없으면 커밋은 그냥 나간다

깃은 훅을 패키지 목록에서 찾지 않습니다. .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/ npm install --save-dev lefthook # https://lefthook.dev/usage/ npx lefthook install npx lefthook validate # lefthook.yml # https://lefthook.dev/configuration/parallel/ pre-commit: parallel: true commands: lint: glob: "*.{js,jsx}" run: npx eslint {staged_files} stage_fixed: true

피엔피엠에서 훅이 안 붙으면 빌트 의존을 안 연 것이다

레프트훅 엔피엠 문서는 피엔피엠에서 설치 후 스크립트가 안 돌 수 있다고 적습니다. 빌트 의존 목록에 레프트훅이 없으면 훅이 안 붙습니다.


저는 형제 사이트를 피엔피엠으로 받은 뒤, 커밋이 또 그냥 나갔습니다. 패키지는 있었고 훅 경로는 비어 있었습니다. 워크스페이스 파일의 빌트 의존과 루트 패키지 파일의 같은 칸에 레프트훅을 넣었습니다. 그다음 설치를 다시 돌리니 훅 자리가 생겼습니다. 한글 경로 작업/회사 아래에서도 훅 경로는 저장소 루트 기준입니다.


홈브류로 바이너리만 받아도 됩니다. 맥 초기 도구 목록은 맥 셋업 글입니다. 그 글은 홈브류 순서입니다. 저장소마다 설정 파일을 공유하려면 패키지로 넣고, 설치 후 스크립트가 도는지 한 번 확인합니다. 셸 값이 옆 폴더에 남는 칸은 디렉브 글입니다. 훅 경로와 셸 변수는 별개입니다.


피엔피엠은 빌트 의존에 레프트훅을 적는다
# 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 로 합쳐진 설정을 확인
커밋 전에 스테이된 파일만 린트가 돌고 통과하는 체크 화면
공백 한 줄로 훅이 도는지 확인한 뒤 형제 사이트에 같은 파일을 둔다

오늘 한 줄 | 패키지만 있으면 커밋은 그냥 나갑니다. 설정 파일을 커밋하고 설치를 한 번 돌린 뒤, 공백 커밋으로 훅이 도는지 봅니다.


참고 자료


내부 연계: 시크릿 체크, includeIf, 노드 테스트, 액션 동시성, 맥 셋업, 바이옴, 디렉브, 파이썬 타입체크


훅 경로와 공백 커밋이 표보다 우선입니다. 위 동작은 2026년 8월 공개 문서 기준입니다.


자주 묻는 질문

허스키만 있으면 레프트훅은 필요 없나?

넥스트만 쓰고 준비 스크립트가 안정적으로 돌면 허스키로 충분합니다. 스테이지만 고를 때는 린트스테이지가 한 칸 더 필요합니다. 피엔피엠 설치 후 스크립트가 자주 빠지거나, 노드 밖 명령도 같은 파일에 두고 싶으면 레프트훅이 맞습니다.


검증 없음으로 커밋해도 되나?

한 번은 됩니다. 커밋 전과 커밋 메시지를 함께 뺍니다. 상시로 켜면 시크릿과 린트를 막는 칸이 사라집니다. 로컬만 건너뛸 때는 레프트훅 영 또는 허스키 영이 범위가 더 좁습니다.


피엔피엠에서 훅이 안 붙는 이유는?

레프트훅 문서가 빌트 의존 목록을 요구합니다. 없으면 설치 후 스크립트가 안 돌아 훅 자리가 비습니다. 목록에 이름을 넣고 설치를 다시 돌리거나, 설치 명령을 한 번 직접 실행합니다.


린트스테이지 없이 스테이지만 돌릴 수 있나?

레프트훅은 글롭과 스테이된 파일 자리가 설정에 있습니다. 허스키 커밋 전 파일은 셸이라, 스테이지만 고르려면 린트스테이지를 따로 둡니다.


액션에서 같은 명령을 또 돌리나?

로컬 훅은 스테이지만, 액션은 전체 검사를 두는 편이 맞습니다. 로컬을 건너뛴 커밋이 푸시되면 액션이 막아 줍니다. 로컬만 믿고 액션 검사를 끄지 않습니다.


레프트훅 로컬 파일은 커밋하나?

안 합니다. 본 설정은 커밋하고, 로컬 파일은 깃이그노어에 둡니다. 문서도 팀원에게 강요하지 않을 명령을 그 파일에 두라고 적습니다.


lefthookhuskygit 훅pre-commit오픈소스개발자Next.js깃허브프론트엔드린트API데브옵스피엔피엠

관련 도구

함께 보면 좋은 문제 해결

EXPLORE / Open Source

이어서 읽어보기

전체 토픽 둘러보기