複数のリモートリポジトリでgitを使用する方法
gitは、複数の場所に同時にプッシュおよびプルするように設定でき、1つのローカルコピーだけを維持しながら、2つの異なるプラットフォームにコードを保存できます。設定方法は以下の通りです。
リモート、説明された
ブランチの「リモート」は、あなたのローカルのgitリポジトリが変更を取得するためのURLです。あなたのローカルgitリポジトリは完全にあなたのものであり、他の人のコードがリモートにコミットをプッシュするまでは影響を受けません。皆さんが同じリモートを使用していてすべてが同期されていることを願っていますが、リモートは単なるエンドポイントです。そのエンドポイントをクローンして、新しいリモートに切り替えることもあまり問題なく行えます。
新しいリポジトリをクローンするたびに、デフォルトのリモートは「origin」として設定されます。任意のgit リポジトリのリモートを確認するには、次のコマンドを実行します:
git remote -vこれは、おそらくあなたが使用しているGitHubまたはその他のサービスの主要リポジトリのURLを表示します。複数のリモートがある場合、それらもここに表示されます。
しかし、originがデフォルトのリモートであるからといって、1つに制限されるわけではありません。なぜ2つのリモートが必要なのか?良い使用例はAWSのCodeCommitです。これはホスティングされたgitリポジトリであり、EC2コンピューティングプラットフォームとの多くの統合があり、ソースコントロールから直接サーバーに自動化されたコードデプロイを可能にします。
しかし、CodeCommitはGitHub、GitLab、BitBucketのようなより特化したgitプロバイダーと比べるとかなり使い勝手が悪く、これらのプロバイダーが優れている理由であるCI/CD統合もありません。したがって、あなたはジレンマに直面しています---CodeCommitをデフォルトのgitソリューションとして使用するのか、それとも自分で自動化されたコードデプロイメントパイプラインを構築するのか。
しかし、複数のリモートを使用すると、簡単にコードを2つ目のリポジトリにプッシュできます。サーバーを更新したいときは、プライマリのソースコントロールからCodeCommitに変更をプッシュしてデプロイメントパイプラインを開始することができます。
複数のリモートを設定する
gitをこのように使用するのは実際には非常に簡単です。既存のフォルダーをプッシュするのと同じ方法でリモートを追加しますが、"origin"リモートを追加する代わりに、別の名前を付けます。
git remote add <name> <url>その後、2つ目のリモートにプッシュしたい場合は、リモート名とブランチをプッシュコマンドに追加します:
git push second masterまたは、デフォルトのリモートを--set-upstreamを使用して切り替えます。
git push --set-upstream second masterこれは最もシンプルなセットアップですが、リモート名を引数として渡すか、毎回リモートを切り替える必要があります。
実際、2つのリモート設定を使用している場合、2番目のリモートへのコードプッシュを管理するためのより良い方法が必要になるでしょう。これを git で処理する最良の方法は、AWS CodeCommitへのデプロイなど、2番目のアップストリームにプッシュされたコード用に別のブランチを作成することです。
checkout -bを使ってブランチを作成できます:
git checkout -b deployment次に、デプロイメントリモートを追加します:
git remote add deployment <url>
マスターブランチを取得します:
git fetch deployment master次に、現在のブランチのアップストリームを設定するには、次のコマンドを実行します:
git branch --set-upstream-to=deployment/masterこのプロセスは任意の数のブランチに対して繰り返すことができるため、複数のリモートを管理するための優れた方法です。しかし、これはあくまでローカルの設定に過ぎないため、このブランチをプライマリリポジトリにプッシュすると、他の人のデプロイメントブランチは自動的に第二のリモートを使用するように設定されていないことに注意してください。
第二のブランチが片方向だけであるのが理想です。つまり、コードをプッシュするだけで、新しいコードをプルしないことを意味します。そうしないと予期しないコンフリクトに遭遇する可能性があります。それ以外は、git は複数のリモートと問題なく動作します。
