Git push -f 被未受保护的分支拒绝

4
我们有自己的GitLab服务器,并将一个旧项目导入其中。该项目具有奇怪的行为,似乎不是gitlab.com服务器上项目的默认行为:如果合并请求需要本地rebase,则在rebase之后无法使用git push --force-with-lease强制推送到远程分支。
! [remote rejected]     feature_branch -> feature_branch (non-fast-forward)
error: failed to push some refs to 'server.de:group/project.git'

远程分支没有受到保护,原则上强制推送应该可以工作。这似乎与任何GitLab配置都无关,而与旧的GitLab项目的配置有关。
有人知道如何重新配置远程配置吗?我甚至不知道要查找什么。我的同事在这里找到了答案:

https://www.reddit.com/r/git/comments/50td21/comment/d76urb5/

但是我在远程服务器上找不到(无法读取)这个文件。任何帮助都将不胜感激。


你确定在这种情况下需要使用 force-with-lease 而不是普通的强制推送吗?请参考链接:https://dev59.com/yVQJ5IYBdhLWcg3w66U5#52823955 - sytech
除了受保护的分支规则外,还要检查存储库设置中的推送规则,以防止推送(设置->存储库->推送规则)。 - sytech
嗨@sytech,感谢您的建议。不幸的是,常规强制推送也不起作用。我们也没有推送规则部分。据我所了解,根据文档,这仅适用于GitLab高级版。 - Kokookster
你能告诉我们你具体做了什么吗?最好是命令的顺序。 - tukan
2个回答

3
除非日志中包含任何线索,否则您需要检查您的本地GitLab服务器上远程存储库中的配置,该存储库由您的存储库存储引用(例如/ home / git / repositories / ... )。
cd /home/git/repositories/<namespace>/<myRepo.git>
git config -l
# with a recent enough Git
git config -l --show-scope --show-origin

检查您是否有任何设置可能阻止推送,例如receive.denyNonFastforwards

git config --show-scope --show-origin receive.denyNonFastforwards

OP评论区 中确认

首先,我需要了解所有项目路径都是哈希处理的,并且可以在 /var/opt/gitlab/git-data/repositories/@hashed 下找到。
这些哈希值在 UI 管理区域下对应的项目中。

使用哈希路径,我找到了包含 denyNonFastforwards 的配置文件。
我使用 git config --file config receive.denynonfastforwards false 进行修改。

然而,这将所有权更改为 root,导致无法推送。
因此,我使用 chown git: config 将所有权更改回 git。之后,一切都按预期工作。


1
@LeGEC 谢谢您的反馈。我已经相应地编辑了答案。 - VonC
谢谢!这很有帮助。我需要找到存储位置,因为它配置为使用哈希路径。确实,在配置文件中设置了 denyNonFastforwards。然而,任何 git 命令都没有输出。改变这个配置的最安全的方法是什么? - Kokookster
好的,我使用了 git config --file config [...] 来更改它。但是,这也改变了权限。后来我不得不手动设置它。但现在它有效了!再次感谢你! - Kokookster
@Kokookster 很好,干得漂亮!(抱歉耽搁了一会儿,我离开键盘了一段时间)。你最终使用了什么确切的命令? - VonC
首先,我必须理解所有项目路径都被哈希化并可在“/var/opt/gitlab/git-data/repositories/@hashed”下找到。哈希值在UI管理员区域中对应的项目下。使用哈希路径,我找到了具有 denyNonFastforwardsconfig 文件。我使用 git config --file config receive.denynonfastforwards false 更改了它。但是这将所有者更改为 root,所以没有任何推送工作。因此,我必须使用 chown git:config 将所有者更改回 git。之后,一切都按预期工作了。 - Kokookster
@Kokookster非常感谢您的反馈,非常有帮助。我已经将您的评论包含在答案中以增加可见性。 - VonC

-1
在任何情况下,您都不应该强制推送到远程git存储库,否则您可能会丢失一些本地机器上没有的更改。
至于问题,可能是因为您正在将其推送到具有不相关历史记录的不同分支,这种情况发生在您在本地初始化git并且默认分支为master,但是当您创建新存储库时,远程分支为main,因此您无法从此处推送到那里,因为它们是不相关的历史记录。

1
在特性分支上使用 git push --force-with-lease 是可以的。你不会有任何代码丢失的风险,无论是你自己的还是你团队成员的。https://dev59.com/yVQJ5IYBdhLWcg3w66U5 - jackdbd
@jackdbd 没有机会尝试,但我得到了这个想法,谢谢。 - Ahmed Hani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接