我刚刚开始使用gerrit,我想知道为什么我们需要git push gerrit HEAD:refs/for/master
而不是git push origin master
如果我git push origin master
我收到错误! [remote rejected] master -> master (prohibited by Gerrit)
答案 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"]。
成功修补后(即,补丁已被推送到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