Tüm git uzaktan kumandalarına tek bir komutla itilebilir mi?


Yanıtlar:


253

Tüm dalları tüm uzaktan kumandalara itmek için:

git remote | xargs -L1 git push --all

Veya belirli bir dalı tüm uzaktan kumandalara itmek istiyorsanız:

İtmek masteristediğiniz dalı ile değiştirin .

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

(Bonus) Komut için git takma adı yapmak için:

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

Koşu git pushallartık tüm dalları tüm uzaktan kumandalara itecek.


1
Çok iyi ve basit bir çözüm. BTW -L 1 yerine xargs -l kullanabilirsiniz, -l seçeneği -L 1 ile aynıdır. git remote | xargs -l git push --all
Tony

2
Ben olsun xargs: illegal option -- lOSX'te. git remote | xargs -L1 git push
Anladım

4
Git bu aramayı özel bir komuta dönüştürmenizi sağlar. Sadece 1) yolunuzda olan bir dosyaya, 2) yürütme izinlerine sahip olduğunuz ve 3) "git- [custom name]" (örneğin git-foo, git-push-all) adlı bir dosyaya koyun. basitçe "git [custom name]" yazabilmek (örneğin git foo, git push-all).
Andrew Martin

2
@Tony Ubuntu'da, POISX spesifikasyonunda olmadığı için man xargsseçeneğin -lkullanımdan kaldırıldığını söylüyor .
wjandrea

2
@kyb Git takma adı sözdiziminde, !aşağıdakilerin bir dahili git komutu değil, harici bir kabuk komutu olduğu anlamına gelir.
zayıf

285

Adında allbirkaç repo URL'si olan bir uzaktan kumanda oluşturun :

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

O zaman sadece git push all --all.


İşte böyle görünüyor .git/config:

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

5
Süper harika numara! Tek dezavantajı uzak kafaları hareket ettirmemesidir. git fetch --allBöyle bir itme yaptıktan hemen sonra koşmanız gerekiyor .
madhead

8
Torvalds (Git'in yaratıcısı) bu yöntemi kullandığından bahsediyor, ancak bunun yalnızca kolaylık sağlamak için olduğunu ve hiçbir teknik avantaj sunmadığını belirtiyor marc.info/?l=git&m=116231242118202&w=2 "Ve sonunda," git push all "birden fazla depoya iten her depo için bir kez bağlanır, bu yüzden gerçekten birden fazla" git push "es yapmak için sadece bir kısayol. Gerçek bir teknik avantajı yok, sadece bir kolaylık var."
Matt

14
Bu yaklaşımla ilgili bir sorun, alluzaktan kumandaya kullanılabilir olduklarında yeni URL'ler eklemeniz gerektiğinde, git remote | xargs -L1 git push --allyeni uzaktan kumandaları otomatik olarak alacaktır.
Raffi Khatchadourian

2
İpucu: allBir taahhüt gönderdiğinizde yazmanıza gerek git remote set-url --add origin nodester-host:path/proj.git
kalmazsa

push url'leri ayarlamayı unuttum yoksa git pushtüm url'leri güncellemez. Yanıt buna göre güncellenmiştir
user3338098

88

Her zaman repo1, repo2 ve repo3'e basmak, ancak her zaman yalnızca repo1'den çekmek istiyorsanız, uzak 'başlangıç ​​noktasını'

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

Komut satırında yapılandır:

$ 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

Eğer varsa sadece gelen çekme istiyorum repo1ama itme repo1ve repo2 belirli dalı içinspecialBranch :

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

Bkz. Https://git-scm.com/docs/git-config#git-config-branchltnamegtremote .


4
Bunun neden daha fazla oyu olmadığından emin değilim. Bu gerçekten çok uygundur, çünkü git pushherhangi bir argüman olmadan bir yapmanıza izin verir .
Husky

1
Benim için oy verin, lütfen!
Meng Lu

1
Bana bunu yapmanın daha uygun bir yolu gibi geliyor. En yüksek oyu almalıydım.
Ahmad

Çok kullanışlıdır. Pushurl'u sadece ana branşla sınırlamak mümkün mü?
fbucek

17

CLI .git / config dosyasını düzenlemeye alternatif olarak, aşağıdaki komutları kullanabilirsiniz:

# 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

Aynı git push all --allburada da çalışır.

Cevap 1 ile aynı işlemi yaptınız. Bunu yapılandırma dosyasının ham olarak düzenlenmesi yerine Komut Satırı ile yaptınız.


2

Bir çağrıda birçok uzaktan kumandaya basmak için kısa bir bash işlevi yazdım. Tek bir uzaktan kumandayı parametre olarak, boşluklarla ayrılmış birden fazla uzaktan kumanda belirtebilir veya tüm uzaktan kumandalara itmesini sağlamak için herhangi bir uzaktan kumanda belirtemezsiniz.

Bu .bashrc veya .bash_profile dosyasına eklenebilir.

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
}

Örnek: Diyelim ki deponuzda 3 uzaktan kumanda var: rem1, rem2 ve rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.