【发布时间】: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/…