1つのコマンドですべてのgitリモートにプッシュできますか?


194

代わりに:

git push origin --all && git push nodester --all && git push duostack --all

1つのコマンドだけでそれを行う方法はありますか?

ありがとう:)


1
次も参照してください:stackoverflow.com/q/5620525/223092
Mark Longair

作成するにはall、すべてのリモコン上のプッシュにリモートを参照してください。stackoverflow.com/a/18637593/802365
エドゥアール・ロペス

回答:


252

すべてのブランチをすべてのリモートにプッシュするには:

git remote | xargs -L1 git push --all

または、特定のブランチをすべてのリモートにプッシュする場合:

masterプッシュするブランチに置き換えます。

git remote | xargs -L1 -I R git push R master

(ボーナス)コマンドのgitエイリアスを作成するには:

git config --global alias.pushall '!git remote | xargs -L1 git push --all'

実行git pushallすると、すべてのブランチがすべてのリモートにプッシュされます。


1
非常に優れたシンプルなソリューション。ところで、-L 1の代わりにxargs -lを使用できます。-lオプションは-L 1と同じです。また、git pushに--allを追加することもあります。git remote | xargs -l git push --all
Tony

2
xargs: illegal option -- lOSX に乗っています。それをgit remote | xargs -L1 git push
考え出し

4
Gitでは、カスタムコマンドにその呼び出しを行うことができます。1)がパス上にあり、2)実行権限があり、3) "git- [カスタム名]"と呼ばれるファイル(例えばgit-foo、git-push-all)に置くだけで、単に「git [カスタム名]」と入力できます(例:git foo、git push-all)。
アンドリューマーティン

2
@TonyはUbuntu で、POISX仕様に含まれていないため、このman xargsオプション-lは廃止されると述べています。
wjandrea 2017

2
@kyb gitエイリアス構文で!は、以下は内部gitコマンドではなく、外部シェルコマンドであることを意味します。
18

285

all名前にいくつかのリポジトリURLを使用してリモートを作成します。

git remote add all origin-host:path/proj.git
git remote set-url --add all nodester-host:path/proj.git
git remote set-url --add all duostack-host:path/proj.git

その後だけgit push all --allです。


これは次のようになります.git/config

  [remote "all"]
  url = origin-host:path/proj.git
  url = nodester-host:path/proj.git
  url = duostack-host:path/proj.git

5
超クールなトリック!唯一の欠点は、リモートヘッドが動かないことです。このgit fetch --allようなプッシュを実行した直後に実行する必要があります。
マッドヘッド2013年

8
Torvalds氏(Gitの作成者)はこの方法を使用していると述べていますが、これは単に便宜上のものであり、技術的な利点は何もないことを明言しています。marc.info/?l=git&m=116231242118202&w=2 「そして最後に、複数のリポジトリにプッシュするgit push all "は、実際には各リポジトリに対して一度だけ接続するため、実際には複数の" git push "を実行するための省略形にすぎません。実際の技術的な利点はなく、単に便利です。」
マット

14
このアプローチの1つの問題は、新しいURL allが使用可能になったときにリモートに追加する必要があることですが、新しいURL git remote | xargs -L1 git push --allは自動的に取得されます。
Raffi Khatchadourian、2015

2
ヒント:不要タイピングへall:あなたがコミット送るたび、だけではなく、「すべて」の「起源」を使用git remote set-url --add origin nodester-host:path/proj.git
Macabeus

プッシュURLの設定を忘れた場合git pushは、すべてのURLが更新されません。回答はそれに応じて更新
user3338098

88

常にrepo1、repo2、およびrepo3にプッシュしたいが、常にrepo1からのみプルしたい場合は、リモート 'origin'を次のように設定します。

[remote "origin"]
    url = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo2
    pushurl = https://exampleuser@example.com/path/to/repo3
    fetch = +refs/heads/*:refs/remotes/origin/*

コマンドラインで設定:

$ git remote add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo2
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo3

あなたがもしのみからプルしたいrepo1が、プッシュするrepo1repo2 、特定のブランチ用specialBranch

[remote "origin"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[remote "specialRemote"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[branch "specialBranch"]
    remote = origin
    pushRemote = specialRemote
    ...

https://git-scm.com/docs/git-config#git-config-branchltnamegtremoteを参照してください


4
なぜこれ以上の票が得られなかったのか分かりません。git push引数なしでa を実行できるので、これは実際には本当に便利です。
ハスキー、

1
投票してください!
Meng Lu

1
これは私にはこれを行うためのより適切な方法のようです。最高の票を持っている必要があります。
Ahmad

とても便利です。pushurlをマスターブランチのみに制限することは可能ですか?
fbucek

17

.git / configファイルを編集する代わりのCLIとして、次のコマンドを使用できます。

# git remote add all origin-host:path/proj.git
# git remote set-url --add all nodester-host:path/proj.git
# git remote set-url --add all duostack-host:path/proj.git

git push all --allここでも同じことが言えます。

回答1と同じことを達成しました。設定ファイルを直接編集するのではなく、コマンドラインでそれを行ったところです。


2

1回の呼び出しで多くのリモートにプッシュする短いbash関数を作成しました。パラメータとして単一のリモートを指定することも、スペースで区切って複数のリモートを指定することも、すべてのリモートにプッシュするように指定することもできません。

これは、.bashrcまたは.bash_profileに追加できます。

function GitPush {
  REMOTES=$@

  # If no remotes were passed in, push to all remotes.
  if [[ -z "$REMOTES" ]]; then
    REM=`git remote`

    # Break the remotes into an array
    REMOTES=$(echo $REM | tr " " "\n")
  fi

  # Iterate through the array, pushing to each remote
  for R in $REMOTES; do
    echo "Pushing to $R..."
    git push $R
  done
}

例:リポジトリに3つのリモート(rem1、rem2、およびrem3)があるとします。

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.