Capable de pousser vers toutes les télécommandes git avec la seule commande?


Réponses:


253

Pour pousser toutes les branches vers toutes les télécommandes:

git remote | xargs -L1 git push --all

Ou si vous souhaitez pousser une branche spécifique vers toutes les télécommandes:

Remplacez masterpar la branche que vous souhaitez pousser.

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

(Bonus) Pour créer un alias git pour la commande:

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

La course git pushallva maintenant pousser toutes les branches vers toutes les télécommandes.


1
Solution très bonne et simple. BTW vous pouvez utiliser xargs -l au lieu de -L 1, l'option -l est la même que -L 1. Aussi, parfois j'ajoute --all à la poussée git. git remote | xargs -l git push --all
Tony

2
Je xargs: illegal option -- lmonte sur OSX. git remote | xargs -L1 git push
Compris

4
Git vous permet de faire cet appel dans une commande personnalisée. Il suffit de le mettre dans un fichier 1) sur votre chemin, 2) vous avez des autorisations d'exécution pour, et 3) appelé "git- [nom personnalisé]" (par exemple git-foo, git-push-all) et vous aurez être capable de taper simplement "git [nom personnalisé]" (par exemple git foo, git push-all).
Andrew Martin

2
@Tony Sur Ubuntu, man xargsdit que l'option -lest déconseillée car elle n'est pas dans la spécification POISX.
wjandrea

2
@kyb Dans la syntaxe d'alias git, !signifie que ce qui suit n'est pas une commande git interne, mais une commande shell externe.
faible

285

Créez une alltélécommande avec plusieurs URL de référentiel à son nom:

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

Alors juste git push all --all.


Voici à quoi cela ressemble .git/config:

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

5
Truc super cool! Le seul inconvénient est qu'il ne déplace pas les têtes distantes. Vous devez courir git fetch --alljuste après avoir fait une telle poussée.
madhead

8
M. Torvalds (créateur de Git) mentionne qu'il utilise cette méthode, mais il déclare que c'est simplement pour des raisons de commodité et n'offre aucun avantage technique marc.info/?l=git&m=116231242118202&w=2 "Et au final, même un" git push all "qui pousse vers plusieurs référentiels finira en fait par se connecter une fois pour chaque référentiel, donc c'est vraiment juste un raccourci pour faire plusieurs" git push "es. Il n'y a pas de réel avantage technique, juste une commodité."
Matt

14
Un problème avec cette approche est que vous devez ajouter de nouvelles URL à la alltélécommande à mesure qu'elles deviennent disponibles, tandis que vous git remote | xargs -L1 git push --allrécupérerez automatiquement toutes les nouvelles télécommandes.
Raffi Khatchadourian

2
Astuce: pour ne pas avoir besoin de taper allchaque fois que vous envoyez un commit, utilisez simplement "origin" au lieu de "all":git remote set-url --add origin nodester-host:path/proj.git
Macabeus

J'ai oublié de définir les URL de push sinon la git pushmise à jour de toutes les URL ne sera pas effectuée. réponse mise à jour en conséquence
user3338098

88

Si vous voulez toujours pousser vers repo1, repo2 et repo3 mais toujours tirer uniquement depuis repo1, configurez la source d'origine comme

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

Configurer en ligne de commande:

$ 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

Si vous souhaitez uniquement extraire repo1mais pousser vers repo1et repo2 pour une branche spécifiquespecialBranch :

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

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


4
Je ne sais pas pourquoi cela n'a pas obtenu plus de votes. C'est vraiment très pratique car cela vous permet de faire un git pushsans aucun argument.
Husky

1
Votez pour moi, s'il vous plaît!
Meng Lu

1
Cela me semble une façon plus appropriée de procéder. Aurait dû avoir les votes les plus élevés.
Ahmad

C'est très utile. Est-il possible de limiter pushurl à la branche maître uniquement?
fbucek

17

Comme alternative CLI à la modification du fichier .git / config, vous pouvez utiliser les commandes suivantes:

# 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

La même chose git push all --allfonctionne ici aussi.

Vous avez accompli la même chose que la réponse n ° 1. Vous venez de le faire avec la ligne de commande au lieu de modifier brutalement le fichier de configuration.


2

J'ai écrit une fonction bash courte pour pousser vers de nombreuses télécommandes en un seul appel. Vous pouvez spécifier une seule télécommande comme paramètre, plusieurs télécommandes séparées par des espaces ou n'en spécifier aucune pour la pousser vers toutes les télécommandes.

Cela peut être ajouté à votre .bashrc ou .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
}

Exemple: Supposons que votre dépôt ait 3 télécommandes: rem1, rem2 et rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.