我刚开始使用gerrit,我想知道为什么我们需要做git push gerrit HEAD:refs/for/master
而不是做git push origin master
如果我这样做,git push origin master
我会收到错误消息! [remote rejected] master -> master (prohibited by Gerrit)
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,【放入“Pending Changes”暂存区],经过审核,审核通过),Gerrit将变更从“Pending Changes”推送到“ Authoritative Repository”,根据你推送到refs/for/<BRANCH>
. 这样,可以直接从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的说法