【问题标题】:"git push" to Gerrit with a tracking branch带有跟踪分支的“git push”到 Gerrit
【发布时间】:2014-03-23 16:45:59
【问题描述】:

将更改推送到 Gerrit 需要相当深奥的命令

git push origin HEAD:refs/for/branchname

我们已经为此编写了脚本,但我正在寻找一种本地执行此操作的方法。借助 git 的强大配置,我似乎可以预配置其中的大部分内容[1],这样只需 git push 就足够了……几乎。我被困在remote.<name>.push refspec 上。

我已经可以创建一个 tracking 主题分支,以便git pull(没有其他参数)将更改从上游远程拉入我的主题分支。但是对于 Gerrit,push 和 fetch refspec 并不相同:一个从 refs/heads/trackbranch 获取(合并),但一个推送到 refs/for/trackbranch[2]

我可以在remote.<name>.push 中配置push refspec,但是语法非常基本:如果我输入 push = refs/heads/*:refs/for/*

那将尝试将我的t-foo 主题分支推送到refs/for/t-foo。但是 git 有 t-foo 正在跟踪 trackbranch 的信息。我可以定义一个 refspec 以便 git 自动尝试将任何 t-foo 推送到它的 refs/for/trackbranch 吗?

我们目前正在使用脚本来执行此操作,我想我可以为每个主题分支定义一个推送 refspec(可能通过更多脚本编写)。我希望有一种本地 git 方式来执行此操作,这样我们的团队就不需要依赖更多自定义的内部脚本。

[1] 通过使用git checkout origin/upstream_branch -b topic_branch 或在现有分支git branch --set-upstream-to origin/upstream_branch 中定义跟踪分支

[2] 推送到 refs/for/* 会创建一个变更集以供审查。有了适当的权限,可以推送到refs/heads/* 以绕过审查,但这否定了 Gerrit 的大部分观点。

【问题讨论】:

  • "我可以定义一个 refspec 以便 git 自动尝试将任何 t-foo 推送到它的 refs/for/trackbranch 吗?"不,至少我今天不这么认为。你想要得到的是 fetch=... 映射机制 git 与合并名称一起使用(映射 remote=merge= 部分),它似乎没有在任何地方公开。不过,您可以编写一个程序来咀嚼您的一组本地分支并计算所有这些(然后更新您的 gitconfig)。不管怎样,还是有点痛。
  • 是的,这就是我想做的。如果这得到了证实,为什么不把它作为答案呢?
  • 经过更多搜索,我的问题类似于两年前的stackoverflow.com/questions/7101145/…和去年的stackoverflow.com/questions/14320363/…

标签: git push gerrit refspec


【解决方案1】:

由于某种原因 :-) 我继续尝试编写脚本来设置 git config 条目,然后发现似乎没有办法直接获得所需的结果。

作为替代方案,我编写了一个推送到“gerrit 评论名称”的脚本(注意:我实际上并没有使用 gerrit,所以这基本上未经测试,尽管我已经使用--dry-run 选项,它看起来像是做正确的事——但我希望你可能想要修改它)。当然,这可能在功能上与您自己的脚本相同。

无论如何,您可以拥有一个全局或系统范围的别名 git config alias.review 或类似的名称来运行脚本,这样您就可以说 git reviewgit review branch。别名就是review = !sh /path/to/script(此时参数将自动传递)。

我把脚本放在这里:http://web.torek.net/torek/git/gerrit-review.sh.txt.txt 扩展名只是为了让浏览器默认查看它,而不是默认下载它)。

【讨论】:

    【解决方案2】:

    你看过 git-review 插件吗?它应该很合算!

    https://pypi.python.org/pypi/git-review

    【讨论】:

    • 我没有,它看起来很有趣,但它仍然是一个额外的脚本,而不是使用 git 广泛的本机功能(我们已经从使用我们自己开发的“主题分支”标签转向支持git 的“跟踪”功能)。这令人沮丧,因为看起来几乎所有东西都在那里,除了链中的最后一个环节。
    • 我明白你的意思,但考虑到 git 曾经几乎没有关于版本控制的原生特性。它的核心是一个内容可寻址的文件系统。其他一切都围绕它成长为小的附加脚本,最终被移植到 C 中以提高速度。从某种意义上说,git-review 和其他任何东西一样“原生”......
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 2016-05-14
    • 1970-01-01
    • 2012-10-07
    • 2016-08-09
    • 2010-10-05
    • 2019-09-30
    相关资源
    最近更新 更多