Question tirer / pousser à partir de plusieurs endroits éloignés


Le court: Y at-il un moyen d'avoir un repo git pousser et tirer d'une liste de repos à distance (plutôt que d'une seule "origine")?

Le long: J'ai souvent une situation où je développe une application sur plusieurs ordinateurs, avec une connectivité différente - disons un ordinateur portable en transit, un ordinateur "A" pendant que je suis à un certain endroit, et un autre ordinateur "B" un autre. En outre, l'ordinateur portable peut avoir une connectivité avec seulement "A" ou "B", et parfois les deux.

Ce que j'aimerais, c'est que git puisse toujours «tirer» et «pousser» tous les ordinateurs auxquels il peut actuellement se connecter, il est donc plus facile de passer d'une machine à l'autre et de continuer à travailler de manière transparente.


598
2018-05-11 18:07


origine


Réponses:


Vous pouvez configurer plusieurs référentiels distants avec git remote commander:

git remote add alt alt-machine:/path/to/repo

Pour extraire de toutes les télécommandes configurées et mettre à jour les branches de suivi, mais ne pas fusionner dans HEAD, faites:

git remote update

S'il n'est pas actuellement connecté à l'une des télécommandes, cela prendra un certain temps ou provoquera une erreur, et passera à la suivante. Vous devrez fusionner manuellement à partir des dépôts récupérés, ou sélectionner des cerises, en fonction de la façon dont vous souhaitez organiser la collecte des modifications.

Pour aller chercher la branche principale d'alt et la tirer dans votre tête actuelle, faites:

git pull alt master

Donc en fait git pull est presque raccourci pour git pull origin HEAD (En fait, il regarde dans le fichier de configuration pour déterminer cela, mais vous avez l'idée).

Pour pousser les mises à jour, vous devez le faire manuellement à chaque repo. Une poussée a été, je pense, conçue avec le workflow central-référentiel à l'esprit.


407
2018-05-11 20:34



Faire cela manuellement n'est plus nécessaire, avec des versions modernes de git! Voir Malvineousla solution, ci-dessous.

Reproduit ici:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

Réponse originale:

Ce quelque chose que j'ai utilisé pendant un certain temps sans mauvaises conséquences et suggéré par Linus Torvalds sur le liste de diffusion git.

araqnidLa solution est la bonne pour amener le code dans votre référentiel ... mais lorsque vous avez, comme moi, plusieurs ascendants autoritaires équivalents (je garde certains de mes projets les plus critiques clonés à la fois en amont privé, GitHub et Codaset), il peut être difficile d'apporter des changements à chacun, tous journée.

Longue histoire courte, git remote add toutes vos télécommandes individuellement ... et puis git config -e et ajoutez une télécommande fusionnée. En supposant que vous avez ce référentiel config:

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

... pour créer une télécommande fusionnée "Paws" et "Codaset", Je peux ajouter ce qui suit après tout:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

Une fois que je l'ai fait, quand je git push Origin Master, il va pousser à la fois Paws/Master et Codaset/Master séquentiellement, ce qui rend la vie un peu plus facile.


702
2017-07-07 13:56



La dernière version de git (en date d'octobre 2012) vous permet de le faire depuis la ligne de commande:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

alors git push va pousser à user1 @ repo1, puis pousser à user2 @ repo2. Omettre --push si vous voulez aussi pouvoir git pull d'eux aussi.


201
2017-10-09 08:20



J'ai ajouté ces alias à mon ~ / .bashrc:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

26
2017-12-25 03:06



Vous pouvez ajouter des télécommandes avec:

git remote add a urla
git remote add b urlb

Ensuite, pour mettre à jour tous les repos font:

git remote update

18
2018-05-16 10:48



Voici mon exemple avec script bash à l'intérieur .gitconfig section alias

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

12
2017-11-30 01:20



J'ai ajouté deux pushurl séparés à la "origine" à distance dans le fichier .git congfig. Quand je cours git push origin "branchName" Ensuite, il va parcourir et pousser à chaque URL. Je ne sais pas s'il existe un moyen plus simple d'accomplir cela, mais cela fonctionne pour pousser moi-même le code source de Github et pousser le code source My.visualStudio en même temps.

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

6
2018-06-01 17:11



Vous aurez besoin d'un script pour les parcourir. Git ne fournit pas un "pousser tout". Vous pouvez théoriquement faire un push dans plusieurs threads, mais une méthode native n'est pas disponible.

Fetch est encore plus compliqué, et je recommande de le faire linéairement.

Je pense que votre meilleure réponse est d'avoir une fois une machine que tout le monde fait pousser / tirer, si c'est possible.


3
2018-05-11 18:19



J'ai pris la liberté d'élargir le répondre de nona-urbiz; ajoutez ceci à votre ~ / .bashrc:

git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }    
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

Usage:

git-pullall master

git-pushall master ## or
git-pushall

Si vous ne fournissez aucun argument de branche pour git-pullall, l'extraction des télécommandes non-par défaut échouera; a laissé ce comportement tel quel, puisqu'il est analogue à git.


3
2018-04-17 16:00



Pour mettre à jour les télécommandes (c'est-à-dire pull cas), les choses sont devenues plus faciles.

La déclaration de Linus

Malheureusement, il n'y a même pas moyen de faire semblant avec un git   alias.

dans l'entrée référencée au Liste de diffusion Git dans La réponse de elliottcable n'est plus vrai.

git fetch appris le --all paramètre quelque part dans le passé permettant d'aller chercher toutes les télécommandes en une seule fois.

Si tous ne sont pas demandés, on pourrait utiliser le --multiple passer afin de spécifier plusieurs télécommandes ou un groupe.


3
2017-11-21 15:18