1. ホーム
  2. git

[解決済み] Git - コードを2つのリモートにプッシュする [重複] [重複

2022-03-20 16:26:50

質問

私は リモート git リポジトリ。 origingithub

自分のブランチをプッシュする devel を両方のリポジトリに追加しました。

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

でも、そうすると git push にプッシュされるだけだろう。 github .

2つのリモートをセットアップして、1つのコマンドで両方のリポジトリに変更をプッシュできるようにする方法はないですか?

解決方法は?

最近のバージョンのGitでは、複数の pushurl を指定したリモートで使用できます。以下を使用して、2つの pushurlorigin :

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を再追加する必要があります。実行方法 git remote -v をクリックすると、各リモートの現在の URL が表示されます。

アップデイト2。 GitのメンテナであるJunio C. Hamanoは、そのように設計されていると説明しました。やること git remote set-url --add --push <remote_name> <url> が追加され pushurl は、指定されたリモートに対して オーバーライド は、プッシュのデフォルトURLです。ただし、複数の 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/*

さて、ひとつのコマンドで複数のリポジトリにプッシュしたい場合は、新しいリモートである 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

次に pushurlall リモートで、別のリポジトリを指しています。

$ 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 をプッシュします。 master ブランチを git://another/repo.git だけです。これは、どのように pushurl はデフォルトの url (remote.all.url) をオーバーライドします。

では、もうひとつの 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 を追加したのはそのままです。今度は1つの git push all master を押すと master ブランチを両方の git://another/repo.gitgit://original/repo.git .

重要なお知らせ : リモートでプッシュの受け入れ/拒否のルール(フック)が分かれている場合、一方のリモートでは受け入れられ、他方では拒否されることがあります。そのため、両者の履歴をまったく同じにしたい場合は、ローカルでコミットを修正して両方のリモートで受け入れられるようにしてから再度プッシュするか、あるいは履歴を書き換える (たとえば push -f この場合、あなたの以前の変更をすでにリポジトリから取得している人に迷惑がかかる可能性があります。