git push - >代码只审查当前更改(remote.origin.push覆盖push.default)

Tad*_*sen 6 git config gerrit

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

默认的推送行为如下所示:

user$ git push --dry-run
To https://gerrit.company.url/project
   83fa2a5..aca3a22  feature -> feature
Run Code Online (Sandbox Code Playgroud)

这将绕过不希望的审查过程.

当我设置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
Run Code Online (Sandbox Code Playgroud)

现在它正试图推featurerefs/for/feature这是我想要的,但它也试图以我的所有分支推到原点.Gerrit拒绝多个请求,所以我得到这样的输出:

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)
Run Code Online (Sandbox Code Playgroud)

但我发现,如果我命名当前的分支,它会做我所期望的:

user $ git push origin feature --dry-run
To https://gerrit.company.url/project
 * [new branch]      feature -> refs/for/feature
Run Code Online (Sandbox Code Playgroud)

这很好,我将能够使用它,但我想缩小它.我想如果我设置push.defaultcurrent这将意味着git 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
Run Code Online (Sandbox Code Playgroud)

这似乎忽略了push.default设置,从git配置文档:

push.default

定义在未明确给出refspec的情况下git 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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?我如何git push只推动当前的分支feature -> refs/for/feature

小智 3

我不相信目前只用 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
Run Code Online (Sandbox Code Playgroud)

据我所知,唯一可以实现您最初目标的等效工具是使用 3rd 方工具,例如OpenStack 开发人员为自己使用而组合在一起的git-review工具。如果您的团队计划使用 gerrit,那么这可能是值得的,因为它提供了其他功能,例如轻松选择或检查评论。

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