Mampu mendorong ke semua remote git dengan satu perintah?


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.


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

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://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/*

Konfigurasikan di baris perintah:

$ 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

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

[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
    ...

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


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.