Git - 2つのリモートにコードをプッシュする 質問する

Git - 2つのリモートにコードをプッシュする 質問する

リモートgitリポジトリが2つありますorigingithub

ブランチをdevel両方のリポジトリにプッシュします。

git push -u origin devel
git push -u github devel

しかし、そうすると、git pushにプッシュされるだけですgithub

1 つのコマンドで両方のリポジトリに変更をプッシュできるように、2 つのリモートを設定する方法はありますか?

ベストアンサー1

pushurlGit の最近のバージョンでは、特定のリモートに対して複数の を追加できます。pushurlに 2 つの を追加するには、以下を使用しますorigin

git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git

したがって、 にプッシュするとorigin、両方のリポジトリにプッシュされます。

更新 1 : Git 1.8.0.1 および 1.8.1 (およびおそらく他のバージョン) には、最初に使用したときに元の URL が置き換えられるバグがあるようです --add 。そのため、同じコマンドを使用して元の URL を再度追加する必要があります。これを行うと、 git remote -v 各リモートの現在の URL が表示されます。

更新 2: Git のメンテナーである Junio C. Hamano が、これがどのように設計されたかを説明しています。 を実行すると、特定のリモートにgit remote set-url --add --push <remote_name> <url>が追加され、プッシュのデフォルトの URLが上書きされます。ただし、特定のリモートに複数の を追加することもできます。これにより、単一の で複数のリモートにプッシュできるようになります。この動作は以下で確認できます。pushurlpushurlgit push

$ git clone git://original/repo.git
$ git remote -v
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.'
remote.origin.url=git://original/repo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

ここで、1つのコマンドを使用して2つ以上のリポジトリにプッシュしたい場合は、all@アダム・ネルソン) を使用するか、 を使い続けますoriginが、後者の名前はこの目的には適していません。 それでも を使用する場合はorigin、次の手順をスキップし、他のすべての手順でoriginの代わりにを使用しますall

allそこで、後で複数のリポジトリにプッシュするときに参照する、という新しいリモートを追加しましょう。

$ git remote add all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)               <-- ADDED
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git            <-- ADDED
remote.all.fetch=+refs/heads/*:refs/remotes/all/* <-- ADDED

次に、別のリポジトリを指すようにリモートpushurlに追加します。all

$ git remote set-url --add --push all git://another/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)                 <-- CHANGED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git         <-- ADDED

ここでは、 push のgit remote -v新しい を示していますpushurl。 を実行すると、ブランチがのみ にgit push all masterプッシュされます。 これは、がデフォルトの URL (remote.all.url) を上書きする方法を示しています。mastergit://another/repo.gitpushurl

pushurl次に、元のリポジトリを指す別のものを追加しましょう。

$ git remote set-url --add --push all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git
remote.all.pushurl=git://original/repo.git        <-- ADDED

追加した の両方が保持されていることがわかりますpushurl。これで、単一の がブランチをと の両方にgit push all masterプッシュします。mastergit://another/repo.gitgit://original/repo.git

重要な注意: リモートにプッシュを受け入れる/拒否する個別のルール (フック) がある場合、一方のリモートではプッシュが受け入れられ、もう一方のリモートでは受け入れられない可能性があります。したがって、両方のリモートでまったく同じ履歴を持つようにするには、コミットをローカルで修正して両方のリモートで受け入れられるようにし、再度プッシュする必要があります。そうしないと、履歴を書き換える ( を使用push -f) ことによってのみ修正できる状況に陥り、リポジトリから以前の変更をすでにプルしたユーザーに問題が発生する可能性があります。

おすすめ記事