2つのリモートgitリポジトリがあります。origin
とgithub
devel
ブランチを両方のリポジトリにプッシュします。
git push -u origin devel
git push -u github devel
しかし、私がそうするとき。git push
にプッシュされるだけですgithub
。
とにかく、1つのコマンドで両方のリポジトリに変更をプッシュできるように2つのリモートを設定できますか?
Gitの最近のバージョンではpushurl
、特定のリモートに複数のを追加できます。以下を使用して、次の2つを追加pushurl
します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(および場合によっては他のバージョン)には--add
、最初に使用するときに元のURLを置き換えるバグがあるようです。そのため、同じコマンドを使用して元のURLを再度追加する必要があります。 。これにより、各リモートの現在のURLgit remote -v
が明らかになります。
更新2: GitのメンテナーであるJunio C. Hamanoは、それがどのように設計されたかを説明しました。これを行うと、特定のリモートにがgit remote set-url --add --push <remote_name> <url>
追加され、プッシュのデフォルトURLが上書きされます。ただし、特定のリモートに複数のを追加することができます。これにより、単一のを使用して複数のリモートにプッシュできます。この動作は以下で確認できます。pushurl
pushurl
git 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つ以上のリポジトリにプッシュする場合は、名前の付いた新しいリモートを作成するか( @Adam Nelsonがコメントで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
ここにプッシュgit remote -v
の新機能を示しpushurl
ます。そうすると、ブランチのみgit push all master
にプッシュされます。これは、デフォルトのURL(remote.all.url)をオーバーライドする方法を示しています。master
git://another/repo.git
pushurl
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
プッシュします。master
git://another/repo.git
git://original/repo.git
重要な注意:リモートにプッシュを受け入れる/拒否するための明確なルール(フック)がある場合、一方のリモートはそれを受け入れ、もう一方は受け入れない場合があります。したがって、それらにまったく同じ履歴を持たせたい場合は、コミットをローカルで修正して、両方のリモートで受け入れられるようにし、再度プッシュする必要があります。そうしないと、履歴を書き換えるだけで修正できる状況になる可能性があります。 (を使用push -f
)。これにより、以前の変更をリポジトリから既にプルしているユーザーに問題が発生する可能性があります。
1つのコマンドで両方のリモートに送信するには、そのエイリアスを作成します。
git config alias.pushall '!git push origin devel && git push github devel'
これにより、コマンドを使用するgit pushall
と、両方のリポジトリが更新されます。