Git推送错误预接收挂钩被拒绝

Posted

技术标签:

【中文标题】Git推送错误预接收挂钩被拒绝【英文标题】:Git push error pre-receive hook declined 【发布时间】:2015-04-03 19:27:43 【问题描述】:

我已经在虚拟机上运行了 gitlabhq rails server,按照本教程 https://github.com/gitlabhq/gitlab-recipes/blob/master/install/centos/README.md 的 1-6 步操作,并启动 rails server 执行命令 sudo -u git -H bundle exec rails s -e production。之后,我使用管理工具创建了用户并在该用户下创建了新项目。然后我试图将现有项目一如既往地推送到这个 repo。但在最后一步,git push origin master 失败并出现错误

[remote denied] master -> master (pre-receive hook denied)

附加信息:

1) 我没有通过电子邮件激活链接激活用户(项目所有者),因为我没有在服务器端配置邮政服务,并且我没有在本手册中找到如何执行此操作的说明。

2) Gitlab 服务器生成如何将项目推送到 repo 的提示,并且路径中没有 repositories/。我的意思是它生成 git@mygitlabhost:user/repo.git 而不是 git@mygitlabhost:repositories/user/repo.git 这是正确的。

3) 当我尝试调试它时,我在服务器上的 repo 中打开了 pre-receive 脚​​本并尝试输出变量(其中有 3 个):refs = ARGF.readkey_id = ENV['GL_ID']repo_path = Dir.pwd 并发现, key_id 始终为空。也许问题就在这里......如果是这样,请给我有关如何解决这个问题的建议。谢谢

【问题讨论】:

我发誓,每个软件开发团队中至少有一个人每天醒来并思考如何让其他开发人员的生活变得更加艰难。 看起来有一个非常流行的答案,它必须适用于大多数人。然而,在我的情况下,当尝试推送时意外地从另一台机器上进行了另一次推送时,从 GitHub 收到了相同的消息。 【参考方案1】:

我只是因为 AWS 损坏而经历过这种情况。

要排除这种情况,只需检查消息是否包含类似于

<head><title>504 Gateway Time-out</title></head>

因此,如果您之前没有做过任何可疑的事情并且刚刚开始看到这一点 - 可能只是服务器超时。

【讨论】:

【参考方案2】:

我在使用 Bitbucket 时遇到了同样的问题。

在推送时,错误是“提交消息与正则表达式不匹配**”。

转到“设置”>“挂钩”>启用“另一个提交检查器”选项。

它开始工作了!!

【讨论】:

如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review【参考方案3】:

这是因为 Master 分支受到保护,这里是清除此错误的步骤。

    在你的主分支git checkout -b new-branch-name中创建一个分支 推送新分支git push --set-upstream origin new-branch-name 现在将分支远程合并到 master。 合并后,重置本地主分支git reset --soft HEAD~1 终于git pull

【讨论】:

不是正确的解决方案。它会显示与 master 相同的错误。【参考方案4】:

请尝试:

git push -u origin master

如果还是无法推送成功,请新建一个分支或选择另一个分支并推送到新的分支上

【讨论】:

【参考方案5】:

请检查“开发中”中的 JIRA 状态。 对我来说,它不是,当我将 jira 状态更改为“开发中”时,它对我有用。

【讨论】:

【参考方案6】:

尽管问题是特定于 gitlab 的,但类似的错误可能会在 github 上发生,具体取决于它的设置方式(通常是 Github Enterprise)。

您需要熟悉以下概念:

预接收挂钩 组织网络钩子 网络挂钩

Webhooks 比其他两项更容易理解。

预接收挂钩

是在 GitHub Enterprise 服务器上运行的脚本 执行政策。当推送发生时,每个脚本运行在一个 isolated environment 判断推送是被接受还是被拒绝。

组织网络钩子:

Webhook 事件也会从您的存储库发送到您的“组织 webhook”。 more info.

这些设置在您的 github 企业中。它们特定于 github 企业 的版本。 由于您的访问限制(开发人员、维护人员、管理员等),您可能无法查看。

【讨论】:

为什么投反对票?这是一种未记录的新行为,需要为社区提供。【参考方案7】:

我也遇到过同样的问题,这是因为我直接在 master 分支中推送我的代码,而我没有权限。所以我将我的代码推送到一个新分支中,然后,我创建了一个拉取请求以与 master 合并。

【讨论】:

【参考方案8】:

我已经按照 heroku logs img https://devcenter.heroku.com/articles/buildpacks#detection-failure 的指示(使用 cmd: heroku logs -> 显示你的错误) 然后执行 cmd:“heroku buildpacks:clear”。最后,它对我有用!

【讨论】:

【参考方案9】:

GitLab 默认将master 分支标记为protected(参见https://about.gitlab.com/2014/11/26/keeping-your-code-protected/ 中的Protecting your code 部分为什么)。如果你的情况是这样,那么这会有所帮助:

打开您的项目 > 设置 > 存储库并转到“受保护的分支”,在列表中找到“主”分支并单击“取消保护”并重试。

通过https://gitlab.com/gitlab-com/support-forum/issues/40

8.11 及以上版本 操作方法在这里:https://docs.gitlab.com/ee/user/project/protected_branches.html#restricting-push-and-merge-access-to-certain-users

【讨论】:

UI 发生了一些变化:在项目“设置”之后,单击“存储库”选项卡。然后是“受保护的分支” 所以我遇到了同样的问题 OP 有这个解决方案对我有用,谢谢!但现在我想知道,为什么?我已经使用 gitlab 有一段时间了,突然间我这样做了?发生了什么变化? 由于GitLab 8.11 选项发生了一些变化,请查看详细信息here 面临同样的问题。在这里,我什至无法推送其他分支。不过我是第一次推它。 我删除了未受保护的但现在会发生什么?世界上其他任何人都可以在这个 repo 上工作吗?【参考方案10】:

我在使用 BitBucket 时偶然发现了同样的错误。我有一个本地 Git 存储库,我想在线备份,所以我从我的 BitBucket 帐户(使用 Web 界面)创建了一个新存储库。

在运行git remote add origin git@bitbucket.org:StatMarianne/<a private repo>.git 之后,我运行git push origin master 无济于事(我通常不使用带有git push-u 选项,因为我不介意输入完整的repo和推拉时的分支名称)。

错误读取:

remote: You're not allowed to write to this repository.
To bitbucket.org:StatMarianne/<a private repo>.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@bitbucket.org:StatMarianne/<a private repo>.git'

但是当我运行 git push -u origin master 时,我的本地分支确实被成功推送(严格遵循 BitBucket 的说明)。

我觉得很奇怪,因为 -u (--set-upstream) 应该只“添加上游(跟踪)参考......”无论如何。

【讨论】:

【参考方案11】: 推荐的答案 GitLab

就我而言,我的团队领导创建了一个 repo(repo 为空)并将我分配为 developer 所以当我直接推送代码以掌握我面临的错误! [remote rejected] master -&gt; master (pre-receive hook declined) 所以如何解决他分配给我作为维护者的问题,以便我能够将代码直接推送给主人。

【讨论】:

我该怎么做? 要求 repo 所有者授予您维护者的权利 替代方案:要求 repo 所有者在 master 中推送一些东西/Readme.md 然后您可以推送代码,如果您仍然面临您遇到的问题使用-f 命令推送代码,完整命令为git push origin master -f 我创建了自己的 repo,然后我尝试将主分支推送到 init(遵循 Gitlab 的初始自述文件),直到我取消保护主分支后它才起作用。有些事情还不清楚。【参考方案12】:

转到项目设置-->挂钩-->(在)预接收挂钩

禁用 cp 在提交中需要问题参考

【讨论】:

【参考方案13】:

在我的本地机器中解决了以下问题:

A.首先,确保您使用正确的登录详细信息连接到 Bitbucket 服务器(即属于您的用户名/密码/SSH 密钥)

B.然后,确保在本地 Git 配置中正确设置了名称/电子邮件地址:为您尝试推送的帐户设置本地 Git 配置(检查断言您是提交文件的人) * 请注意,姓名和电子邮件地址均区分大小写 * 它也对空间敏感 - 一些公司帐户的名称中有额外的空格/字符,例如。 “Contractor/ space space(LDN)”。您必须在配置中包含与 Bitbucket Server 相同数量的空格。如果卡住,请在记事本中检查。

C.如果您使用了错误的帐户,只需切换您的帐户凭据(用户名/密码/SSH 密钥)并再次尝试推送。

D.否则,如果您的本地配置不正确,则需要修改它

对于 MAC

open -a TextEdit.app ~/.gitconfig

注意:您必须修复您尝试推送的旧提交。

    修改你的最后一次提交:

    > git commit --amend --reset-author
    
      
    <save and quit the commit file text editor that opens, if Vim then
    :wq to save and quit>
    

    尝试重新推送您的提交:

    > git push
    

【讨论】:

【参考方案14】:

我通过将 .git/config 中的 remote 'origin' urlhttp 更改为 git 协议解决了这个问题

【讨论】:

【参考方案15】:

可能不是这样,但这是我的“pre-receive hook denied”错误的解决方案:

有些存储库只允许通过拉取请求进行修改。这意味着你必须

    创建一个新分支,以要将更改推送到的分支作为基础。 提交您的更改并将其推送到新分支。 打开拉取请求以将您的分支与原始分支合并。

【讨论】:

这对我有帮助。谢谢!【参考方案16】:

您可能没有开发人员访问项目或主分支的权限。您需要开发人员访问权限才能推动新工作。

新工作意味着新的分支和提交。

【讨论】:

【参考方案17】:

似乎问题出在某些服务上,例如 sidekiq。运行sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production 输出所有配置问题。

【讨论】:

我遇到了 GitLab 的问题,只好重新启动。【参考方案18】:

您需要将您的 ssh 密钥添加到您的 git 帐户,如果它抛出错误然后删除以前的 ssh 密钥并创建一个新的 ssh 密钥然后添加。

【讨论】:

这没有帮助。 :( 在两个帐户上测试 - 虚拟机和本地机器上的 root 和 myuser。 检查 git remote -v,你的 git repo 是否被添加? 'git remote -v' 输出:origin git@mygitlabhost:repositories/user/repo.git (fetch) origin git@mygitlabhost:repositories/user/repo.git (push) 如果您使用托管的 gitlab,问题可能出在他们这边。请在几分钟后重试。

以上是关于Git推送错误预接收挂钩被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

git,Heroku:预接收挂钩被拒绝

RTC SCM 中的 Git 钩子等效项

错误的日期进入预接收挂钩

GitHub:预接收挂钩

Android Studio Git 推送被拒绝

“Git 推送非快进更新被拒绝”是啥意思?