Sei in grado di spingere a tutti i telecomandi git con un solo comando?


Risposte:


253

Per inviare tutti i rami a tutti i telecomandi:

git remote | xargs -L1 git push --all

O se vuoi inviare un ramo specifico a tutti i telecomandi:

Sostituisci mastercon il ramo che vuoi spingere.

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

(Bonus) Per creare un alias git per il comando:

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

La corsa git pushallora spingerà tutti i rami verso tutti i telecomandi.


1
Soluzione molto buona e semplice. A proposito, puoi usare xargs -l invece di -L 1, l'opzione -l è la stessa di -L 1. Inoltre, a volte aggiungo --all alla git push. telecomando git | xargs -l git push --all
Tony

2
Ottengo xargs: illegal option -- lsu OSX. git remote | xargs -L1 git push
Capito

4
Git ti consente di effettuare quella chiamata in un comando personalizzato. Mettilo in un file per cui 1) è sul tuo percorso, 2) hai i permessi di esecuzione e 3) chiamato "git- [nome personalizzato]" (ad esempio git-foo, git-push-all) e essere in grado di digitare semplicemente "git [nome personalizzato]" (ad esempio git foo, git push-all).
Andrew Martin,

2
@Tony Su Ubuntu, man xargsdice che l'opzione -lè obsoleta poiché non è nelle specifiche POISX.
wjandrea,

2
@kyb Nella sintassi di alias git, !significa che quanto segue non è un comando git interno, ma un comando shell esterno.
debole l'

285

Crea un alltelecomando con diversi URL repo al suo nome:

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

Quindi basta git push all --all.


Ecco come appare .git/config:

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

5
Trucco super cool! L'unico svantaggio è che non sposta le testine remote. Devi correre git fetch --allsubito dopo aver fatto una tale spinta.
madhead

8
Il signor Torvalds (creatore di Git) menziona che usa questo metodo, ma afferma che è solo per comodità e non offre alcun vantaggio tecnico marc.info/?l=git&m=116231242118202&w=2 "E alla fine, anche un" git push all "tutto ciò che spinge in più repository finirà per connettersi una volta per ogni repository, quindi è davvero solo una scorciatoia per fare più" git push "es. Non c'è un vero vantaggio tecnico, solo una comodità."
Matt,

14
Un problema con questo approccio è che devi aggiungere nuovi URL al alltelecomando non appena saranno disponibili, mentre git remote | xargs -L1 git push --allraccoglierà automaticamente tutti i nuovi telecomandi.
Raffi Khatchadourian,

2
Suggerimento: per non dover digitare allogni volta che si invia un commit, basta usare "origin" invece di "all":git remote set-url --add origin nodester-host:path/proj.git
Macabeus

dimenticato di impostare gli URL push altrimenti git pushnon aggiornerà tutti gli URL. risposta aggiornata di conseguenza
user3338098

88

Se si desidera premere sempre repo1, repo2 e repo3 ma estrarre sempre solo da repo1, impostare 'origine' remota come

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

Configurare dalla riga di comando:

$ 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

Se vuoi solo estrarre repo1ma spingere verso repo1e repo2 per un ramo specificospecialBranch :

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

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


4
Non sono sicuro del perché questo non abbia ottenuto più voti. Questo in realtà è davvero conveniente perché ti permette di fare semplicemente un git pushsenza argomenti.
Husky,

1
Vota per me, per favore!
Meng Lu

1
Questo mi sembra il modo più appropriato per farlo. Avrei dovuto avere il voto più alto.
Ahmad,

È molto utile. È possibile limitare il pushurl solo al ramo master?
fbucek,

17

Come alternativa CLI alla modifica del file .git / config, è possibile utilizzare i seguenti comandi:

# 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

Lo stesso git push all --allfunziona anche qui.

Hai ottenuto lo stesso risultato della risposta n. 1. L'hai appena fatto con la riga di comando invece della modifica grezza del file di configurazione.


2

Ho scritto una breve funzione bash per inviare a molti telecomandi in una chiamata. È possibile specificare un singolo telecomando come parametro, più telecomandi separati da spazi o non specificare alcuno per farlo spingere su tutti i telecomandi.

Questo può essere aggiunto al tuo .bashrc o .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
}

Esempio: supponiamo che il tuo repository abbia 3 telecomandi: rem1, rem2 e rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.