1

この回答は、複数のリポジトリに同時にプッシュする方法を説明しています。

  1. 私の.git/config内容:

    [remote "all"]
        url = git@github.com:commerce-sciences/scale-master.git
        url = git@heroku.ron:scale-master.git
    
  2. git push allheroku に正常にデプロイされます。

  3. 何らかの理由で変更が github にプッシュされていないようです。

> 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)

私は何が欠けていますか?

4

3 に答える 3

5

リモート リポジトリを構成した方法allでは、ローカル リポジトリの既存のリポジトリにはまったくリンクされません。したがって、 の 2 番目のリポジトリは、同じ URL を持っていますが、同じでallはありません。origin

すべてにプッシュすると、Git はそれoriginを行っている間もプッシュしていることを知りません。そのため、ローカル リポジトリにあるリモート ブランチを更新することはできません。

残念ながら、この動作を変更することはできません。git pushはリモート リポジトリ グループをサポートしていませんgit fetch。少なくともまだ。その場合、Git はリモート リポジトリ (グループ)allからローカル参照への明示的なリンクを持ちorigin、ローカル参照を更新できます。

したがって、今のところ、唯一のオプションは、 にプッシュした直後に個々のリモートをフェッチするか、または単に(リモート追跡ブランチの場合)allを使用するか、最初から明示的にプッシュすることです。git fetch origingit fetch

于 2013-03-07T14:12:09.670 に答える
2

あなたの必要性について私が理解していることから、「すべて」のリモコンは必要ありません。: "origin" リモートで 2 番目のプッシュ URL を構成するだけで、この問題は発生しません。

[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両方の URL にプッシュするようになりました。- git fetch origin(まだ) 最初の URL からのみ取得します

于 2015-02-04T17:43:04.953 に答える
1

しかし、「すべての」リモートと「元の」リモートを本当に分離したい場合でも、必要なことを正しく行うことができます。

鍵は (もう一度) git の非常にクールな構成にあります。

次の場合に何が起こるか見てみましょうgit push all

  • git は最初の URL をプッシュします (OK)

  • git は 2 番目の URL をプッシュします (OK)

  • 次に、最初の URL をフェッチして、リポジトリのリモート ブランチを更新しますrefs/remote/all

git が「事前にコミットする」ことについて不平を言うのはなぜですか? 現在のブランチ (マスター) を上流のブランチ (オリジン/マスター) と比較するためです。

実際には、変更できます (どちらでも十分です)。

  1. 更新されたブランチなので、すべてを refs/remote/all ではなく refs/remotes/origin にフェッチします。[remote "all"]構成ブロックでは、次の行

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

「refs/remotes/all の更新」を意味します。したがって、次のように追加/変更するだけです:

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

これで完了です:同じ効果が得られます (ブランチを更新しますgit fetch origin) 。git fetch allorigin/master

警告 : fetch 構成をいじりすぎると、実際に何が行われたかがわからないリポジトリになる可能性があります。そのため、シンプルで論理的なものにしてください。

  1. git が現在のブランチと比較するリモート ブランチ

の場合git push --set-upstream all、master ブランチは origin/master ではなく all/master に従います。したがって、コミットしたことについて不平を言うことはありません。アップストリーム ブランチは永続的に保持されるため、これは 1 回だけ行う必要があることに注意してください。

要するに :

方法 1 : リモート "all" のフェッチ構成を変更する

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

方法 2 : ブランチを origin/master ではなく all/master に従うようにする

[branch "master"]
    -remote = origin
    +remote = all
    merge = refs/heads/master
于 2015-02-04T18:08:30.850 に答える