如何将不同的本地Git分支推送到Heroku / master


402

Heroku的政策是忽略除“ master”之外的所有分支。

虽然我确定Heroku的设计师有充分的理由执行此政策(我想是为了存储和性能优化),但对我来说,作为开发人员的结果是,无论我正在从事的本地主题部门如何,我都希望有一个简单的方法将Heroku的master切换到该本地主题分支,并执行“ git push heroku -f”以覆盖Heroku上的master。

通过阅读http://progit.org/book/ch9-5.html的“推送参考规范”部分,我得到的是

git push -f heroku local-topic-branch:refs / heads / master

我真正想要的是一种在配置文件中进行设置的方法,以便“ git push heroku”始终执行上述操作,用当前分支的名称替换local-topic-branch。如果有人知道如何做到这一点,请告诉我!

当然,需要注意的是,只有当我是唯一可以推送到该Heroku应用程序/存储库的人时,这才有意义。测试或质量检查团队可能会管理这样的存储库以尝试不同的候选分支,但是他们必须进行协调,以便他们在任何一天都同意将其推向哪个分支。

不用说,拥有独立的远程存储库(例如GitHub)也是一个好主意,而没有将所有内容备份到此的限制。我会称其为“起源”,并为Heroku使用“ heroku”,以便“ git push”始终将所有内容备份到原始位置,而“ git push heroku”会将我当前所在的任何分支推入Heroku的master分支,并覆盖它如有必要。

这行得通吗?

[远程“ heroku”]
    网址= git@heroku.com:my-app.git
    推送= + refs / heads / *:refs / heads / master

尽管我想我可以在Heroku上创建一个虚拟应用程序并对此进行试验,但我还是想听听经验更丰富的人的信息。

至于获取,我并不在乎Heroku存储库是否仅写。我仍然有一个单独的存储库,例如GitHub,用于备份和克隆所有工作。

脚注:这个问题与在Heroku中使用分支策略的Good Git部署相似但又不太相同


1
目前投票最多的答案是惯用的方式(也是Imo真正的正确答案)
Selali Adob​​or

关于推送参考规范的另一个https资源:git scm关于推送参考规范的文档
迪伦·兰德里

Answers:


131

使用通配符时,它必须出现在refspec的两侧,因此+refs/heads/*:refs/heads/master将不起作用。但是您可以使用+HEAD:refs/heads/master

git config remote.heroku.push +HEAD:refs/heads/master

另外,您可以使用git push直接执行此操作:

git push heroku +HEAD:master
git push -f heroku HEAD:master

4
这两个命令之间的区别是什么?或者我们必须同时执行这两个命令
Saad Masood

2
@SaadMasood:最后执行git push命令的功能相同。有关选项git push --help的含义-f+refspec中的,请参见。
克里斯·约翰森

4
@克里斯·约翰逊(Chris Johnson):您能告诉我们-f参数的含义而不是RTFM在这里的家伙吗?
AHH

@AHH -f代表武力贾萨的回答对我有用
陶先生

@Chris Johnson:HEAD是否仅用于推送应用程序的最新版本,而不是整个历史记录?
卡梅伦·威尔比

1566

参见https://devcenter.heroku.com/articles/git#deploying-code

$ git push heroku yourbranch:master

24
可能需要-f力量。
斯科特·斯塔福德

尽管仍在他们的文档中,但这似乎不再起作用。即使强行使用,服务器也拒绝推送,说它无法删除master分支。
Dave Meehan

3
@DaveMeehan这仍然有效。您正在尝试通过不git push :master覆盖任何内容来删除master分支的方法。这与用另一个分支覆盖它不同。Heroku可能有适当的保护措施来防止删除master分支。
丹尼斯

这是一个了不起的解决方案
Ajay Kumar,

2
@nxmohamad除非您的分支位于master分支后面,并且您想覆盖Heroku上的当前代码,否则不会这样做。
瑞克斯

64
git push -f heroku local_branch_name:master

3
请注意,这使用-f--force,并且始终最好确保在强制按下时知道自己在做什么。
MiFiHiBye'5

@ tomasz-mazur为什么需要-f?
nxmohamad

是的,在某些情况下(例如与多个正在进行的分支一起使用,并替换heroku中的所有内容并测试工作分支),我们可能需要使用-f,如果我们还有其他更好的测试方法,请提出建议
Fahad

它可以在我的计算机上运行,​​谢谢您的回答,实际上这种语法在普通的Github存储库中有效吗?
卢阿伦

10

将不同的本地Git分支推送到Heroku / master的最安全的命令。

git push -f heroku branch_name:master

注意:尽管可以不使用-f进行推送,但建议使用-f(强制标志),以避免与其他开发人员的推送冲突。


1
您是否不建议先不使用-f是更好的做法?那么如果有冲突,首先要确认可以将其覆盖
nxmohamad

7

对我来说,它有效

git push -f heroku otherBranch:master

建议使用-f(强制标志),以避免与其他开发人员的推送冲突。由于不是将Git用于版本控制,而是仅用于传输,因此使用force标志是一种合理的做法。

资料来源:- 官方文件


5

另请注意,如果您使用git flow系统和功能分支可能会被称为

feature/mobile_additions

并使用名为stagingtwo的git遥控器,则将命令推送到heroku将是

git push stagingtwo feature/mobile_additions:master

4

您应该检查一下heroku_san,它很好地解决了这个问题。

例如,您可以:

git checkout BRANCH
rake qa deploy

它还可以轻松启动新的Heroku实例,以将主题分支部署到新服务器:

git checkout BRANCH
# edit config/heroku.yml with new app instance and shortname
rake shortname heroku:create deploy # auto creates deploys and migrates

当然,如果您经常执行某些操作,则可以使任务更简单。




0

我认为应该

push = refs/heads/*:refs/heads/*

代替...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.