Git error when trying to push -- pre-receive hook declined
Categories:
Troubleshooting 'pre-receive hook declined' Errors in Git

Understand and resolve the common 'pre-receive hook declined' error when pushing to a Git repository, often indicating server-side validation failures.
The 'pre-receive hook declined' error is a common message encountered by developers when attempting to push changes to a remote Git repository. This error signifies that a server-side script, known as a pre-receive hook, has rejected your push. These hooks are powerful tools used by repository administrators to enforce policies, validate code, and maintain repository integrity. While essential for project governance, they can be a source of frustration if the reason for the decline isn't immediately clear. This article will guide you through understanding what pre-receive hooks are, common reasons for their failure, and effective strategies to diagnose and resolve these issues.
Understanding Git Pre-Receive Hooks
Git hooks are scripts that Git executes automatically before or after events like commit, push, and receive. A 'pre-receive' hook is a server-side hook that runs before any references are updated on the remote repository. Its primary purpose is to validate the incoming push. If the script exits with a non-zero status, the push is declined, and the client receives the 'pre-receive hook declined' error message. This mechanism is crucial for enforcing various repository policies, such as:
- Code Style and Quality: Ensuring pushed code adheres to project standards.
- Commit Message Format: Validating commit messages follow a specific pattern.
- Branch Protection: Preventing direct pushes to protected branches (e.g.,
main
,develop
). - Security Scans: Checking for sensitive information or known vulnerabilities.
- Dependency Checks: Ensuring all required dependencies are declared.
- Merge Request/Pull Request Enforcement: Requiring changes to go through a review process.
flowchart TD A[Developer pushes changes] --> B{Git Server receives push} B --> C{Pre-receive hook executes} C -- Hook passes --> D[References updated on server] C -- Hook fails --> E[Push declined] E --> F[Developer receives 'pre-receive hook declined' error] D --> G[Push successful]
Flow of a Git push with a pre-receive hook
Common Causes and Diagnosis
When a pre-receive hook declines a push, the server typically outputs messages to your console explaining why it was declined. The most effective way to diagnose the issue is to carefully read these messages. They often contain clues about the specific policy violated or the validation that failed. If the message is generic or unclear, you might need to consult with your repository administrator.
Here are some common reasons for pre-receive hook failures:
- Protected Branch Violation: Attempting to push directly to a branch that requires a merge request or pull request.
- Commit Message Format: Commit messages do not adhere to a required pattern (e.g., missing a ticket ID, incorrect length).
- Forbidden File Types/Content: Pushing files that are explicitly disallowed (e.g., large binaries,
.env
files, sensitive credentials). - Linting/Static Analysis Errors: Code does not pass automated linting or static analysis checks.
- Test Failures: The pushed changes break existing tests on the server.
- User Permissions: The user pushing does not have the necessary permissions for the action.
- Server-Side Configuration Issues: Less common, but sometimes the hook itself might have an error or misconfiguration on the server.
Resolving Pre-Receive Hook Errors
Once you've identified the cause of the error, resolving it usually involves adjusting your local changes or workflow. Here's how to approach common scenarios:
- Protected Branch: If you're pushing to a protected branch, create a new branch, push your changes there, and then open a merge/pull request as per your team's workflow.
- Commit Message Issues: Use
git commit --amend
to modify your last commit message to comply with the required format. Then, usegit push --force-with-lease
(orgit push -f
if you understand the risks) to push the amended commit. - Forbidden Files/Content: Remove the problematic files or content from your commit history using
git rebase -i
orgit filter-repo
. Be cautious with history rewriting, especially on shared branches. - Linting/Test Failures: Fix the code issues identified by the hook. Run local linters and tests before pushing to catch these errors early.
- Permissions: Contact your repository administrator to request the necessary permissions or to understand why your current permissions are insufficient.
- Server-Side Issues: If you suspect a server-side problem, report it to your repository administrator or DevOps team.
# Example of a pre-receive hook output indicating a protected branch
remote: ERROR: You are not allowed to push code to protected branches.
remote: ERROR: Please create a merge request instead.
To git@example.com:my-repo.git
! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'git@example.com:my-repo.git'
Typical output for a protected branch violation
1. Read the Error Message
Carefully examine the output from the remote server after the 'pre-receive hook declined' message. This is the most crucial step for diagnosis.
2. Identify the Policy Violation
Based on the error message, determine which specific repository policy or validation check your push failed to meet.
3. Rectify Local Changes
Modify your local commits, branch, or workflow to comply with the identified policy. This might involve amending commit messages, removing files, or creating a new branch.
4. Attempt Push Again
Once you've made the necessary corrections, try pushing your changes again. If you've rewritten history (e.g., git commit --amend
, git rebase
), you might need to use git push --force-with-lease
.
5. Consult Administrator (If Needed)
If the error message is unclear, or you're unable to resolve the issue, reach out to your repository administrator or team lead for assistance.