为什么 git push gerrit HEAD: refs/for/master 被用来代替 git push 的原始 master

我刚刚开始使用 Gerrit,我想知道为什么我们需要做 git push gerrit HEAD:refs/for/master而不是 git push origin master

如果我做 git push origin master我得到的错误说 ! [remote rejected] master -> master (prohibited by Gerrit)

191985 次浏览

Gerrit 的文档,特别是 “推动变革”部分,解释了如何使用“使用任何 Git 客户机工具的神奇 refs/for/'branch' ref”。

下图取自 格里特的简介。当你推到格里特,你做 git push gerrit HEAD:refs/for/<BRANCH>。这会将您的更改推送到 集结地(在图表“ Pending Changes”中)。Gerrit 实际上没有一个名为 <BRANCH>的分支; 它对 git 客户机撒谎。

在内部,Gerrit 有自己的 Git 和 SSH 栈实现。这允许它提供“神奇的”refs/for/<BRANCH>裁判。

当接收到在这些名称空间之一中创建引用的推送请求时,Gerrit 执行自己的逻辑来更新数据库,然后向客户机隐瞒操作的结果。一个成功的结果使客户相信 Gerrit 已经创建了裁判,但实际上 Gerrit 根本没有创建裁判。[ 林克-格里特,“砂砾细节”].

The Gerrit workflow

在一个成功的补丁之后(例如,补丁已经推送到 Gerrit,[把它放到“挂起的变化”阶段区域] ,审查,并且审查已经通过) ,Gerrit 将变化从“挂起的变化”推送到“权威仓库”,计算哪个分支将它推送到当你推送到 abc0的魔法。通过这种方式,成功审查的补丁可以直接从 Authoritative Repository的正确分支中提取出来。

为了避免必须完全指定 git push 命令,您可以选择修改您的 git 配置文件:

[remote "gerrit"]
url = https://your.gerrit.repo:44444/repo
fetch = +refs/heads/master:refs/remotes/origin/master
push = refs/heads/master:refs/for/master

现在你可以简单地:

git fetch gerrit
git push gerrit

这是根据 Gerrit