495

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

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

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

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

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

4

2 に答える 2

789

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が上書きされます。ただし、特定のリモートに複数のを追加することができます。これにより、単一のを使用して複数のリモートにプッシュできます。この動作は以下で確認できます。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つ以上のリポジトリにプッシュする場合は、名前の付いた新しいリモートを作成するか( @Adam Nelsonがコメントでall提案しているように)、を使用し続けることができます。ただし、後者の名前はこの目的ではあまり説明的ではありません。 。それでも使用する場合は、次の手順をスキップして、他のすべての手順の代わりに使用してください。originoriginoriginall

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)をオーバーライドする方法を示しています。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)。これにより、以前の変更をリポジトリから既にプルしているユーザーに問題が発生する可能性があります。

于 2013-01-12T04:12:04.173 に答える
98

1つのコマンドで両方のリモートに送信するには、そのエイリアスを作成します。

git config alias.pushall '!git push origin devel && git push github devel'

これにより、コマンドを使用するgit pushallと、両方のリポジトリが更新されます。

于 2013-01-12T04:12:55.313 に答える