Mampu mendorong ke semua remote git dengan satu perintah?

195

Alih-alih melakukan:

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

Apakah ada cara untuk melakukan itu hanya dengan satu perintah?

Terima kasih :)

balupton
sumber
1
Lihat juga: stackoverflow.com/q/5620525/223092
Mark Longair
Untuk membuat allremote untuk mendorong semua remote Anda, lihat: stackoverflow.com/a/18637593/802365
Édouard Lopez

Jawaban:

253

Untuk mendorong semua cabang ke semua remote:

git remote | xargs -L1 git push --all

Atau jika Anda ingin mendorong cabang tertentu ke semua remote:

Ganti masterdengan cabang yang ingin Anda tekan.

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

(Bonus) Untuk membuat alias git untuk perintah:

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

Menjalankan git pushallsekarang akan mendorong semua cabang ke semua remote.

lemah
sumber
1
Solusi yang sangat bagus dan sederhana. BTW Anda bisa menggunakan xargs -l bukan -L 1, opsi -l sama dengan -L 1. Juga, kadang-kadang saya menambahkan --semua ke git push. git remote | xargs -l git push --all
Tony
2
Saya xargs: illegal option -- lmenggunakan OSX. git remote | xargs -L1 git push
Mencari
4
Git memungkinkan Anda untuk membuat panggilan itu menjadi perintah khusus. Masukkan saja ke dalam file yang 1) ada di jalur Anda, 2) Anda telah menjalankan izin, dan 3) disebut "git- [nama kustom]" (mis. Git-foo, git-push-all) dan Anda akan cukup ketik "git [nama khusus]" (mis. git foo, git push-all).
Andrew Martin
2
@ Tony Pada Ubuntu, man xargsmengatakan opsi -lsudah usang karena tidak ada dalam spesifikasi POISX.
wjandrea
2
@ Kyb In git alias sintaks, !berarti yang berikut ini bukan perintah internal git, tetapi perintah shell eksternal.
lemah
285

Buat allremote dengan beberapa URL repo dengan namanya:

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

Lalu saja git push all --all.


Beginilah tampilannya .git/config:

  [remote "all"]
  url = origin-host:path/proj.git
  url = nodester-host:path/proj.git
  url = duostack-host:path/proj.git
Aristoteles Pagaltzis
sumber
5
Trik super keren! Satu-satunya kelemahan adalah bahwa ia tidak menggerakkan kepala jauh. Anda harus berlari git fetch --allsegera setelah melakukan push seperti itu.
madhead
8
Mr. Torvalds (pencipta Git) menyebutkan bahwa ia menggunakan metode ini, tetapi ia menyatakan bahwa itu hanya untuk kenyamanan dan tidak menawarkan keuntungan teknis marc.info/?l=git&m=116231242118202&w=2 "Dan pada akhirnya, bahkan" git push all "yang mendorong ke beberapa repositori sebenarnya akan berakhir dengan menghubungkan satu kali untuk setiap repositori, jadi itu benar-benar hanya singkatan untuk melakukan beberapa" git push "es. Tidak ada keuntungan teknis nyata, hanya kenyamanan."
Matt
14
Satu masalah dengan pendekatan ini adalah Anda harus menambahkan URL baru ke allremote begitu tersedia, sedangkan git remote | xargs -L1 git push --allakan secara otomatis mengambil remote baru.
Raffi Khatchadourian
2
Kiat: Agar tidak perlu mengetik allsetiap kali Anda mengirim komit, cukup gunakan "asal" alih-alih "semua":git remote set-url --add origin nodester-host:path/proj.git
Macabeus
lupa mengatur url push jika git pushtidak, tidak akan memperbarui semua url. jawaban diperbarui sesuai
user3338098
88

Jika Anda ingin selalu mendorong ke repo1, repo2, dan repo3 tetapi selalu hanya menarik dari repo1, atur remote 'asal' sebagai

[remote "origin"]
    url = https://[email protected]/path/to/repo1
    pushurl = https://[email protected]/path/to/repo1
    pushurl = https://[email protected]/path/to/repo2
    pushurl = https://[email protected]/path/to/repo3
    fetch = +refs/heads/*:refs/remotes/origin/*

Konfigurasikan di baris perintah:

$ git remote add origin https://[email protected]/path/to/repo1
$ git remote set-url --push --add origin https://[email protected]/path/to/repo1
$ git remote set-url --push --add origin https://[email protected]/path/to/repo2
$ git remote set-url --push --add origin https://[email protected]/path/to/repo3

Jika Anda hanya ingin menarik dari repo1tetapi mendorong ke repo1dan repo2 untuk cabang tertentuspecialBranch :

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

Lihat https://git-scm.com/docs/git-config#git-config-branchltnamegtremote .

Meng Lu
sumber
4
Saya tidak yakin mengapa ini tidak mendapat lebih banyak suara. Ini sebenarnya sangat nyaman karena memungkinkan Anda untuk melakukan git pushtanpa argumen.
Husky
1
Pilih saya, tolong!
Meng Lu
1
Ini menurut saya cara yang lebih tepat untuk melakukan ini. Seharusnya memiliki suara tertinggi.
Ahmad
Ini sangat berguna. Apakah mungkin untuk membatasi pushurl hanya untuk cabang utama?
fbucek
17

Sebagai Alternatif CLI untuk mengedit file .git / config, Anda dapat menggunakan perintah berikut:

# 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

Hal yang sama juga berlaku di git push all --allsini.

Anda telah menyelesaikan hal yang sama dengan jawaban # 1. Anda baru saja melakukannya dengan Baris Perintah alih-alih mengedit mentah dari file konfigurasi.

Kurt Vanderwater
sumber
2

Saya menulis fungsi bash pendek untuk mendorong ke banyak remote dalam satu panggilan. Anda dapat menentukan satu remote sebagai parameter, beberapa remote yang dipisahkan oleh spasi atau tidak menentukan apa pun untuk mendorongnya ke semua remote.

Ini dapat ditambahkan ke .bashrc atau .bash_profile Anda.

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
}

Contoh: Misalkan repo Anda memiliki 3 remote: rem1, rem2 dan rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush
KeyboardCowboy
sumber
0

Anda dapat menggunakan kait git - terutama pre-push: menambahkan dorongan non-asal ke .git/hooks/pre-push.

Vitaly Zdanevich
sumber