为什么git push gerrit HEAD:refs / for / master使用而不是git push origin master

时间:2012-05-05 11:05:05

标签: git gerrit

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

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

2 个答案:

答案 0 :(得分:239)

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

以下图片来自the 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。 [Link - Gerrit, "Gritty Details"]。

The Gerrit workflow

成功修补后(即,补丁已被推送到Gerrit,[将其置于“待定更改”暂存区],已审核,并且审核已通过),Gerrit推动了“待更改”中的更改进入“权威知识库”,根据你推到refs/for/<BRANCH>时所做的魔术,计算推进它的分支。这样,成功查看的修补程序可以直接从Authoritative Repository的正确分支中提取。

答案 1 :(得分:51)

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