しかし、「すべての」リモートと「元の」リモートを本当に分離したい場合でも、必要なことを正しく行うことができます。
鍵は (もう一度) git の非常にクールな構成にあります。
次の場合に何が起こるか見てみましょうgit push all
。
git は最初の URL をプッシュします (OK)
git は 2 番目の URL をプッシュします (OK)
次に、最初の URL をフェッチして、リポジトリのリモート ブランチを更新しますrefs/remote/all
。
git が「事前にコミットする」ことについて不平を言うのはなぜですか? 現在のブランチ (マスター) を上流のブランチ (オリジン/マスター) と比較するためです。
実際には、変更できます (どちらでも十分です)。
更新されたブランチなので、すべてを 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 all
origin/master
警告 : fetch 構成をいじりすぎると、実際に何が行われたかがわからないリポジトリになる可能性があります。そのため、シンプルで論理的なものにしてください。
- 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