162

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

如果我这样做,git push origin master我会收到错误消息! [remote rejected] master -> master (prohibited by Gerrit)

4

2 回答 2

274

Gerrit 的文档,特别是“推送更改”部分,解释了您推送到“refs/for/'branch'使用任何 Git 客户端工具的神奇引用”。

下图取自Intro to Gerrit。当你推送到 Gerrit 时,你会这样做git push gerrit HEAD:refs/for/<BRANCH>。这会将您的更改推送到暂存区域(在图中,“待更改”)。Gerrit 实际上并没有一个名为<BRANCH>;的分支。它对 git 客户端说谎。

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

当接收到在这些命名空间之一中创建 ref 的推送请求时,Gerrit 会执行自己的逻辑来更新数据库,然后就操作结果向客户端撒谎。成功的结果会使客户相信 Gerrit 创建了 ref,但实际上 Gerrit 根本没有创建 ref。[链接 - Gerrit,“坚韧不拔的细节” ]。

Gerrit 工作流程

补丁成功后(即补丁已经推送到Gerrit,【放入“Pending Changes”暂存区],经过审核,审核通过),Gerrit将变更从“Pending Changes”推送到“ Authoritative Repository”,根据你推送到refs/for/<BRANCH>. 这样,可以直接从Authoritative Repository.

于 2012-05-05T12:05:08.260 回答
69

为了避免必须完全指定 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的说法

于 2015-04-12T03:10:57.013 回答