Pregunta pull / push desde múltiples ubicaciones remotas


El corto: ¿Hay alguna manera de tener un git repo push to y pull de una lista de repos remotos (en lugar de un único "origen")?

El largo: A menudo tengo una situación cuando estoy desarrollando una aplicación en varias computadoras, con conectividad diferente, por ejemplo, una computadora portátil mientras está en tránsito, una computadora "A" mientras estoy en una determinada ubicación y otra computadora "B" mientras estoy conectado. otro. Además, la computadora portátil puede tener conectividad con solo "A" o "B", y a veces ambas.

Lo que me gustaría es que Git siempre "jale" y "empuje" a todas las computadoras a las que actualmente se puede conectar, por lo que es más fácil saltar de una máquina a otra y continuar trabajando sin problemas.


598
2018-05-11 18:07


origen


Respuestas:


Puede configurar múltiples repositorios remotos con el git remote mando:

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

Para obtener de todos los controles remotos configurados y las ramas de seguimiento de actualizaciones, pero no fusionar con HEAD, haga lo siguiente:

git remote update

Si no está actualmente conectado a uno de los controles remotos, tomará tiempo de espera o arrojará un error, y pasará al siguiente. Tendrá que fusionarse manualmente desde los repositorios extraídos, o seleccionarlos de forma precisa, dependiendo de cómo quiera organizar la recopilación de cambios.

Para recuperar la rama maestra de alt y llevarla a su encabezado actual, haga lo siguiente:

git pull alt master

Entonces de hecho git pull es casi una abreviatura de git pull origin HEAD (en realidad se ve en el archivo de configuración para determinar esto, pero se entiende la idea).

Para empujar las actualizaciones, tienes que hacer eso para cada repositorio de forma manual. Un impulso fue, creo, diseñado con el flujo de trabajo del repositorio central en mente.


407
2018-05-11 20:34



Hacer esto manualmente ya no es necesario, con versiones modernas de git! Ver Malvineoussolución de s, abajo.

Reproducido aquí:

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

Respuesta original:

Este algo que he estado usando durante bastante tiempo sin malas consecuencias y sugerido por Linus Torvalds en el lista de correo de git.

AraqnidLa solución es la adecuada para llevar el código dentro su repositorio ... pero cuando usted, como yo, tiene varias fuentes ascendentes autorizadas equivalentes (mantengo clonados algunos de mis proyectos más críticos tanto en un upstream privado, GitHub, como en Codaset), puede ser una molestia introducir cambios en cada uno, cada día.

Larga historia corta, git remote add todos tus controles remotos individualmente ... y luego git config -e y agrega un control remoto combinado. Asumiendo que tienes este repositorio 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/*

... para crear un control remoto combinado para "Paws" y "Codaset", Puedo agregar lo siguiente después de todo eso:

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

Una vez que he hecho esto, cuando git push Origin Master, empujará a ambos Paws/Master y Codaset/Master secuencialmente, haciendo la vida un poco más fácil.


702
2017-07-07 13:56



La última versión de git (desde octubre de 2012) le permite hacer esto desde la línea de comando:

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

Entonces git push presionará a user1 @ repo1, luego presione a user2 @ repo2. Dejar --push si también quieres ser capaz de git pull de ellos también.


201
2017-10-09 08:20



Agregué estos alias a mi ~ / .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



Puede agregar controles remotos con:

git remote add a urla
git remote add b urlb

Luego, para actualizar todos los repos:

git remote update

18
2018-05-16 10:48



Aquí está mi ejemplo con script bash dentro .gitconfig sección alias

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

12
2017-11-30 01:20



Agregué dos pushurl separados al "origen" remoto en el archivo .git congfig. Cuando corro git push origin "branchName" Luego se ejecutará y empujará a cada url. No estoy seguro de si hay una manera más fácil de lograr esto, pero esto funciona para mí para presionar al código fuente de Github y presionar al código fuente My.visualStudio al mismo tiempo.

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

6
2018-06-01 17:11



Necesitarás un script para recorrerlos. Git no proporciona un "empujar todo". En teoría, puedes hacer un push en varios subprocesos, pero un método nativo no está disponible.

La búsqueda es aún más complicada, y recomendaría hacerlo linealmente.

Creo que tu mejor respuesta es tener una vez una máquina a la que todos hagan push / pull, si eso es posible.


3
2018-05-11 18:19



Me tomé la libertad de expandir el responder de nona-urbiz; solo agrega esto a tu ~ / .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

Uso:

git-pullall master

git-pushall master ## or
git-pushall

Si no proporciona ningún argumento de rama para git-pullall, la extracción de controles remotos no predeterminados fallará; dejó este comportamiento tal como está, ya que es análogo a git.


3
2018-04-17 16:00