“git push all”(多个存储库)不起作用

时间:2013-03-07 13:56:08

标签: git heroku

This answer解释了如何同时推送多个回购。

  1. 我的.git/config包含:

    [remote "all"]
        url = git@github.com:commerce-sciences/scale-master.git
        url = git@heroku.ron:scale-master.git
    
  2. git push all成功部署到heroku。

  3. 由于某种原因,似乎没有将更改推送到github。

  4. > git push all
    Everything up-to-date
    Everything up-to-date
    
    > git status
    # On branch master
    # Your branch is ahead of 'origin/master' by 22 commits.
    #
    nothing to commit (working directory clean)
    

    我错过了什么?

3 个答案:

答案 0 :(得分:5)

您配置all远程存储库的方式根本没有链接到本地​​存储库中的现有存储库。因此,all中的第二个存储库与origin不同,尽管它具有相同的网址。

当你全力以赴时,Git并不知道在这样做时它也会推送到origin。因此,它无法更新本地存储库中的远程分支。

不幸的是,您无法更改此行为。 git push不支持git fetch的远程存储库组。至少尚未。如果是这样,Git将具有从远程存储库(组)allorigin的显式链接,并且可以更新本地引用。

所以现在,唯一的选择就是在推送到all之后,使用git fetch origin或仅git fetch(对于远程跟踪分支)立即获取单个遥控器,或者明确地向他们推送。

答案 1 :(得分:2)

根据我对你的需求的理解,你不需要一个"所有"远程。 :只需在" origin"上配置第二个推送网址。遥远的,你不会遇到这个问题。

[remote "origin"]
    url = git@github.com:commerce-sciences/scale-master.git
    url = git@heroku.ron:scale-master.git

git remote -v的输出:

origin git@github.com:commerce-sciences/scale-master.git (fetch)
origin git@github.com:commerce-sciences/scale-master.git (push)
origin git@heroku.ron:scale-master.git (push)

这意味着: - git push origin现在推送到两个网址。 - git fetch origin(仍然)仅从第一个网址

获取

答案 2 :(得分:1)

但如果你真的想要分开的“全部”和“原点”遥控器,你仍然可以正确地做你想要的。

关键是(再一次)在非常酷的git配置中。

让我们看看git push all时会发生什么:

  • git推送第一个网址(好的)

  • git推送第二个网址(好的)

  • 然后提取第一个网址以更新存储库的远程分支refs/remote/all

为什么git抱怨“提前提交”?因为它将您当前的分支(主)与上游分支(origin / master)进行比较。

事实是,我们可以改变(任何一个就足够了):

  1. 更新的分支,因此我们将所有内容提取到refs / remotes / origin而不是refs / remote / all。在[remote "all"]配置块中,行

    fetch = +refs/heads/*:refs/remotes/all/*

  2. 表示“更新refs / remotes / all”。所以你只需将其添加/更改为:

    `fetch = +refs/heads/*:refs/remotes/origin/*`
    

    已完成:git fetch origingit fetch all现在具有相同的效果(更新origin/master分支)

    警告:过多地使用fetch配置可能会导致您无法知道实际操作的存储库。所以保持简单和合乎逻辑。

    1. git比较你当前的远程分支
    2. 如果你git push --set-upstream all,那么你的主分支将跟随所有/ master而不是origin / master。所以它不会抱怨你提交。请注意,您必须只对此进行一次,因为上游分支是永久保留的。

      简而言之:

      方法1:更改远程“全部”

      的获取配置
      [remote "all"]
         url = (url1)
         url = (url2)
         -fetch = +refs/heads/*:refs/remotes/all/*
         +fetch = +refs/heads/*:refs/remotes/origin/*
      

      方法2:让你的分支跟随all / master而不是origin / master

      [branch "master"]
          -remote = origin
          +remote = all
          merge = refs/heads/master