git pre-push hook

本文介绍如何使用Git的pre-push Hook,在推送代码前自动运行风格检查器,避免因风格问题导致的错误推送到仓库,有效提升代码质量和团队协作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

This article introduces git pre-push hook.

Problem

In Lean project, we use a modified version of Google’s C++ style checker. I want to automatically run the checker over the changed files before I push commits to git repositories. This is useful because it prevents me from accidentally pushing the commits which contain style problems.

Solution: git pre-push hook

Since git 1.8.2, git introduced pre-push hook which is executed before actual push operation is performed. The following two steps solve the problem.

  • Create <PROJECT_ROOT>/.git/hooks/pre-push file with the following contents:
#!/usr/bin/env bash
IFS=' '
DIR="$( cd "$( dirname "$0" )" && pwd )"
CHECKER=$DIR/../../src/cmake/Modules/cpplint.py
while read local_ref local_sha remote_ref remote_sha;
do
    CHANGED_FILES=`git diff --name-only $local_sha $remote_sha | grep '\(cpp\|h\)$'`
    if [ ! -z "$CHANGED_FILES" -a "$CHANGED_FILES" != " " ]; then
        echo $CHANGED_FILES | xargs $CHECKER
        RET=$?
        if [ $RET -ne 0 ]; then
            echo "There is error(s) from style-check. Please fix them before push to the repo."
            exit $RET
        fi
    fi
done
exit 0
  • Give “exec” permission to the file
chmod +x <PROJECT_ROOT>/.git/hooks/pre-push

Note that you need to change CHECKER variable if you want to use other checkers.

 

转载于:https://www.cnblogs.com/jiu0821/p/10760275.html

### 3.1 `pre-receive hook declined` 错误的原因 `pre-receive hook declined` 是 Git 服务器端钩子(hook)阻止提交的一种表现形式。该钩子通常用于在提交正式进入仓库之前进行验证,例如检查提交格式、运行测试、验证代码规范等。当钩子脚本返回非零值时,Git 会拒绝此次提交,提示 `pre-receive hook declined` 错误[^3]。 ### 3.2 分支保护机制的影响 在某些 Git 托管平台(如 GitLab)中,分支保护机制会限制普通用户直接向受保护分支(如 `master` 或 `prod`)推送更改。如果目标分支被设置为 `protected`,只有管理员或具有特定权限的用户才能进行推送操作。普通用户尝试推送时会遇到 `pre-receive hook declined` 错误。解决方式包括: - 修改分支保护设置,将目标分支设为非保护状态; - 将更改推送到非保护分支,随后通过合并请求(merge request)合并到目标分支中[^1]。 ### 3.3 检查本地提交内容 如果提交内容本身存在问题,例如包含不允许的文件类型、不符合编码规范、未通过自动化测试等,`pre-receive` 钩子也可能拒绝提交。可以通过以下方式排查: - 查看提交日志,确认提交内容是否符合项目规范; - 使用 `git log` 和 `git diff` 检查具体更改内容; - 如果有本地钩子(如 `pre-commit`),可运行 `git commit --no-verify` 跳过本地验证,但不能跳过服务器端钩子验证。 ### 3.4 使用非保护分支进行提交 为避免因分支保护机制导致的提交失败,可以创建新的非保护分支,并将更改推送到该分支。具体操作如下: ```bash git branch new-feature git checkout new-feature git add . git commit -m "提交更改" git remote add origin <远程仓库地址> git push -u origin new-feature ``` 之后可以通过合并请求将该分支合并到受保护分支中。 ### 3.5 与项目管理员沟通 由于 `pre-receive` 钩子的逻辑通常由项目管理员配置,因此在遇到该错误时,应与项目管理员联系,确认钩子的具体限制条件。例如,是否启用了代码审查、是否限制了提交格式、是否设置了文件大小限制等。根据管理员反馈,调整提交内容以满足钩子要求。 ### 3.6 强制推送与冲突处理 如果本地分支与远程分支存在冲突,或者提交历史被重写,使用 `git push` 可能失败。虽然可以尝试使用 `git push --force` 进行强制推送,但在受保护分支上通常禁止该操作。此时应优先解决冲突,确保提交历史与远程一致,再进行正常推送。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值