기술 · 실용 가이드
Git push에 “pre-receive hook declined”가 나오나요? 커밋을 고치기 전에 원격 이유를 보존하세요
이 요약은 ref가 바뀌기 전에 원격이 거부했다는 뜻일 뿐 위반 규칙은 알려 주지 않습니다. 원격 출력, ref 매핑, 규칙 소유자를 기록하고 입증된 경계만 고치세요.

“pre-receive hook declined”는 원격 결정 위치이지 원인 자체가 아닙니다. 직전 remote 줄, 정확한 ref 업데이트, 호스트 정책이 핵심 증거입니다.
reset, 강제 push, 파일 삭제, 규칙 완화 전에 비밀을 제거한 거부 원장을 만들고 기여자·관리자·서버 운영자에게 올바르게 배정합니다.
1. 정확한 거부 상태 고정
첫 remote: 줄부터 모든 rejected ref까지 전체 출력을 저장합니다. 비밀을 뺀 URL, transport, local source, remote destination, 실행 계정, 시간, Git 버전을 기록합니다.
reset, rebase, 강제 push, 삭제부터 하면 어떤 commit, path, signature, object, ref가 거부를 일으켰는지 밝힐 payload를 잃을 수 있습니다.
2. 결정 실행 위치 입증
Git 문서는 pre-receive가 업데이트 전에 old OID, new OID, 전체 ref 이름을 읽는다고 설명합니다. 0이 아닌 종료는 수신을 거부하므로 로컬 훅 우회와 무관합니다.
pre-receive, ref별 update 거부, post-receive 오류를 구분하고 괄호 이유와 모든 remote 메시지를 보존합니다.
3. 첫 구체적 remote 줄로 분기
보호 branch, 권한, commit message, author email, 서명, 파일명, 크기, tag 삭제, secret, LFS 누락이 명시되면 바로 그 규칙과 범위를 확인합니다. 인기 원인을 추측하지 않습니다.
유용한 메시지가 없으면 maintainer는 push rule과 보호 ref를, 서버 관리자는 훅 코드·로그·timeout을 확인합니다. 기여자는 실패 ref와 old/new OID를 보존합니다.
4. 편집 전 위반 payload 입증
각 source와 destination을 매핑하고 제안 범위를 remote ref와 비교합니다. 명시된 규칙에 필요한 commit metadata, path, object size, signature, LFS pointer만 조사합니다.
실패 object 또는 policy check와 소유자를 기록합니다. commit 수정, 권한 변경, server hook 복구는 서로 다른 책임 경계입니다.
5. 좁은 수정과 종료 증명
입증된 경계만 바꾸고 같은 ref 업데이트를 다시 시도합니다. 한 번의 push를 위해 공유 규칙을 약화하지 말고, 허용과 의도가 없는 강제 push를 하지 않습니다.
remote ref가 예상 OID를 가리키고 모든 ref가 수락됐는지 확인합니다. 일반 메시지만 남으면 가장 이른 미해결 remote 줄이나 server log로 돌아갑니다.
