Git将当前分支推送到Heroku的远程分支

时间:2010-03-08 12:32:45

标签: git heroku production staging

我正在尝试在Heroku上创建一个临时分支,但是有一些我不太了解。

假设我已经创建了一个heroku应用程序,并将远程设置为指向staging-remote,如果我这样做:

git checkout -b staging staging-remote/master

我得到一个名为'staging'的本地分支,用于跟踪staging-remote / master - 或者这就是我的想法....

可是:

git remote show staging-remote

给我这个:

remote staging
  Fetch URL: git@heroku.com:myappname.git
  Push  URL: git@heroku.com:myappname.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    staging-remote merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

正如您所看到的,拉动看起来合理,但默认推动没有。这意味着,如果我这样做:

git push staging-remote

我要将我的本地主分支推送到暂存分支。但这不是我想要的......基本上,我想将更新合并到我的临时分支中,然后轻松将其推送到heroku而不必像这样指定分支:

git push staging-remote mybranch:master

以上并不难做到,但我想避免意外地进行上一次推送并推错分支......这对于我想创建的制作分支来说非常重要!

我已经尝试过使用git配置,但还没弄明白如何正确使用它...

7 个答案:

答案 0 :(得分:25)

我测试了它,@ juba和@ MatthewFord的版本完美运行!

git config remote.staging.push staging:master

这会将名为登台的本地主题分支推送到名为登台的远程存储库上的远程分支 master

@nickgrim将它放在一般形式中:

git config remote.[remoteRepositoryName].push [localBranchName]:[remoteBranchName]

更新

此外,当您使用git push选项-u时,现代git将方便地为您运行上述配置命令:

git push -u staging staging:master

答案 1 :(得分:7)

我有一个名为heroku的分支,这对我有用:

git config remote.heroku.push heroku:master

你面临的问题是heroku忽略除master之外的所有分支。

答案 2 :(得分:3)

从书“O'Reilly - 使用Git进行版本控制”第184页|第11章:远程存储库

  

在git push操作期间,您通常希望提供并发布更改   你在当地的话题分支上做的。允许其他人在中找到您的更改   上传后,远程存储库中的更改必须作为主题分支出现在该存储库中。因此,在典型的git push命令期间,源分支   您的存储库使用refspec发送到远程存储库,例如:

+refs/heads/*:refs/heads/*
     

此refspec可以解释为:   从本地存储库中,获取源命名空间下的每个分支名称   refs/heads/并将其放在目的地下的类似命名的匹配分支中   远程存储库中的名称空间refs/heads/。   第一个refs/heads/引用您的本地存储库(因为您正在执行推送),   第二个引用远程存储库。星号确保所有分支   被复制了。   ...


这就是为什么来自朱巴的例子应该失败的原因。纠正的refspec应该是:

git config remote.staging-remote.push +refs/heads/local_branch_name:refs/heads/master

答案 3 :(得分:1)

来自页面 Everiday Git,有20个命令

http://www.kernel.org/pub/software/scm/git/docs/everyday.html

似乎您可以通过向本地git存储库添加config指令来实现您想要做的事情,例如:

git config remote.staging-remote.push mybranch:refs/remotes/staging-remote/master

然后,如果您从 mybranch 本地分支执行git push,则应将其推送到 staging-remote的分支遥控。

尽管如此,请在使用之前与git remote show staging-remote进行验证并仔细测试,因为我离git专家很远......

答案 4 :(得分:0)

我无法找到一种方法来做到这一点,但最后我找到了一个方便的rake任务来简化: http://www.jbarnette.com/2009/11/10/deploying-to-heroku.html

答案 5 :(得分:0)

我有同样的问题试图弄清楚如何处理Heroku忽略所有分支但是'主'的政策。如果你只能在Heroku上测试主分支,它有点打破了保持单独分支的重点。

这个限制的结果是,无论我在做什么本地主题分支,我都想要一个简单的方法将Heroku的主人切换到本地主题分支,并做一个“git push -f”来覆盖主人在Heroku上。毋庸置疑,拥有一个单独的远程存储库(如Github)是一个非常好的主意,可以在不受此限制的情况下支持所有内容。我称之为“原点”,并使用“heroku”作为Heroku,以便“git push”始终支持所有内容。

我从阅读http://progit.org/book/ch9-5.html的“Pushing Refspecs”部分得到的是

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

我真正想要的是一种在配置文件中设置它的方法,以便“git push heroku”始终执行上述操作,将“local-topic-branch”替换为我当前分支所发生的任何名称是

我可能会问这是一个新问题,看看是否有其他人已经知道如何做到这一点。

答案 6 :(得分:0)

这很有效。我已经使用它多次使用git-flow,heroku和备份git服务来设置客户端。

回购的

.git / config:

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
[heroku]
  account = youraccount
[remote "origin"]
  url = git@bitbucket.org:youruser/yoursite.heroku.com.git # or github, etc.
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
[branch "staging"]
  remote = origin
  merge = refs/heads/staging
[branch "develop"]
  remote = origin
  merge = refs/heads/develop
[remote "production"]
  pushurl = git@heroku.com:your-prod-app.git
  push = master:master
[remote "staging"]
  pushurl = git@heroku.com:your-staging-app.git
  push = staging:master

一切正常:

git push origin

git pull origin

git push staging

git push production

考虑像stdout和stdin一样获取和推送,其中两者都可以重定向或关闭为单向。此外,如果有人知道如何在没有黑客.git / config的情况下获得这些设置,请随时修改编辑,业力点肯定会跟随。