首页 > 解决方案 > git push -> 仅审查当前更改(remote.origin.push 覆盖 push.default)

问题描述

我的团队正在使用 gerrit 代码审查,本质上这意味着默认推送行为绕过了标准工作流程,因此我们需要使用它git push origin HEAD:refs/for/feature来正确推送我们的代码以进行审查。

默认推送行为如下所示:

user$ git push --dry-run
To https://gerrit.company.url/project
   83fa2a5..aca3a22  feature -> feature

这将绕过不受欢迎的审查过程。

当我将 push ref-spec (在此处参考)设置为时refs/heads/*:refs/for/*,这朝着正确的方向迈出了一步:

user $ git config remote.origin.push refs/heads/*:refs/for/*
user$ git push --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

现在它正试图推动我想要的,但它也试图将我所有的分支推到原点featurerefs/for/featureGerrit 拒绝了多个请求,因此我得到如下输出:

user$ git push
....
To https://gerrit.company.url/project
 ! [remote rejected] master -> refs/for/master (no new changes)
 ! [remote rejected] old_stuff -> refs/for/old_stuff (duplicate request)
 ! [remote rejected] feature -> refs/for/feature (duplicate request)

但我发现,如果我命名当前分支,它会达到我的预期:

user $ git push origin feature --dry-run
To https://gerrit.company.url/project
 * [new branch]      feature -> refs/for/feature

这很棒,我将能够使用它,但我想进一步缩小范围。我想如果我设置它意味着只会以这种方式推送当前分支,但令我失望的是push.defaultcurrentgit push

user$ git config push.default current
user$ git push origin --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

这似乎忽略了push.default设置,来自git config 文档

push.default

定义在没有明确给出 refspecgit push时应该采取的操作

所以remote.origin.push配置被解释为明确的参考规范?即使将默认推送行为设置为nothing它仍会尝试推送所有分支:

user$ git config push.default nothing
user$ git push
fatal: You didn't specify any refspecs to push, and push.default is "nothing".
user$ git config remote.origin.push refs/heads/*:refs/for/*
user$ git push origin --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

我在这里想念什么?我如何才能git push像推送当前分支一样feature -> refs/for/feature

标签: gitconfiggerrit

解决方案


我不相信目前只用 git 就可以完成您想做的事情。

通过在我的配置文件中定义远程服务器别名,我已经能够将其进一步缩小一个级别,如下所示,一个我可能想要推送的每个分支,但这显然是乏味和令人讨厌的,我仍然必须输入类似git push masterrev.

    [remote "origin"]
        url = ssh://gerritserver/product
        fetch = +refs/heads/*:refs/remotes/origin/*
    [remote "masterrev"]
        url = ssh://gerritserver/product
        fetch = +refs/heads/*:refs/remotes/origin/*
        push = HEAD:refs/for/master

我知道提供您最初目标的唯一等价物是使用 3rd 方工具,例如 OpenStack 开发人员为自己使用而组合在一起的git-review工具。如果您的团队计划使用 gerrit,这可能是值得的,因为它提供了其他功能,例如轻松访问樱桃采摘或查看评论。

顺便说一句,我相信“当前”的 push.default 设置只是假设本地分支名称应该通过 remote.*.push 修改推送,即使它们还不知道存在于服务器。它不限制将哪些分支推送到“当前”分支,而是使用“当前”名称。


推荐阅读