En resumen: ¿hay alguna manera de hacer que un repositorio de git empuje y extraiga de una lista de repositorios remotos (en lugar de un solo "origen")?
El largo: a menudo tengo una situación en la que estoy desarrollando una aplicación en varias computadoras, con conectividad diferente, por ejemplo, una computadora portátil mientras estoy en tránsito, una computadora "A" mientras estoy en un lugar determinado y otra computadora "B" mientras que en otro. Además, la computadora portátil puede tener conectividad solo con "A" o "B", y algunas veces con ambas.
Lo que me gustaría es que git siempre "jale" y "empuje" a todas las computadoras a las que se puede conectar actualmente, por lo que es más fácil saltar de una máquina a otra y continuar trabajando sin problemas.
git
, se incluye en la respuesta de malvineous a continuación . La respuesta aceptada es incorrecta.Respuestas:
Puede configurar múltiples repositorios remotos con el
git remote
comando:Para obtener todos los controles remotos configurados y actualizar las ramas de seguimiento, pero no fusionarse
HEAD
, haga lo siguiente:Si no está conectado actualmente a uno de los controles remotos, tomará un tiempo de espera o arrojará un error, y pasará al siguiente. Tendrá que fusionarse manualmente desde los repositorios recuperados o
cherry-pick
, según cómo desee organizar la recopilación de cambios.Para obtener la rama maestra de alt y colocarla en tu cabeza actual, haz lo siguiente:
De hecho,
git pull
es casi una forma abreviada degit pull origin HEAD
(en realidad, se ve en el archivo de configuración para determinar esto, pero se entiende la idea).Para enviar actualizaciones, debe hacer eso en cada repositorio manualmente.
Creo que un impulso fue diseñado teniendo en cuenta el flujo de trabajo del repositorio central.
fuente
¡Hacer esto manualmente ya no es necesario , con versiones modernas de
git
! Ver la solución de Malvineous , a continuación.Reproducido aquí:
Respuesta original:
Este algo que he estado usando durante bastante tiempo sin malas consecuencias y sugerido por Linus Torvalds en la lista de correo de git .
La solución de araqnid es la adecuada para llevar el código a su repositorio ... pero cuando, como yo, tiene múltiples fuentes ascendentes autoritativas equivalentes (mantengo algunos de mis proyectos más críticos clonados tanto en una cadena ascendente privada, GitHub y Codaset), Puede ser un dolor empujar cambios a cada uno, todos los días.
En pocas palabras,
git remote add
todos sus controles remotos individualmente ... y luegogit config -e
y agregue un control remoto combinado. Suponiendo que tenga este repositorioconfig
:... para crear un control remoto combinado para
"Paws"
y"Codaset"
, puedo agregar lo siguiente después de todo eso:Una vez que haya hecho esto, cuando
git push Origin Master
lo haga, presionará a ambosPaws/Master
yCodaset/Master
secuencialmente, haciendo la vida un poco más fácil.fuente
git config -e
abre el.git/config
archivo en su editor preferido.git
la línea de comandos lo admite de forma nativa, congit remote set-url ... --add
.[branch "Master"]
conjuntoremote = Origin
ygit pull
usará ambos controles remotos.Desde git 1.8 (octubre de 2012) puede hacerlo desde la línea de comandos:
Luego
git push
empujará al usuario1 @ repo1, luego empujará al usuario2 @ repo2.fuente
git fetch
. (Teniendo en cuenta esto, no entiendo cuál es el propósito degit remote set-url --add
puede estar sin--push
.)Agregué estos alias a mi ~ / .bashrc:
fuente
git config alias.pushall '!for i in
git remote; do git push $i; done;'
alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'
Puede agregar controles remotos con:
Luego, para actualizar todos los repositorios:
fuente
Aquí está mi ejemplo con script bash dentro de la
.gitconfig
sección de aliasfuente
Agregué dos pushurl separados al "origen" remoto en el archivo .git congfig. Cuando corro
git push origin "branchName"
Entonces correrá 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 empujar al código fuente de Github y empujar al código fuente My.visualStudio al mismo tiempo.fuente
Me tomé la libertad de ampliar la respuesta de nona-urbiz; simplemente agregue esto a su ~ / .bashrc:
Uso:
Si no proporciona ningún argumento de bifurcación para git-pullall, la extracción de los controles remotos no predeterminados fallará; dejó este comportamiento tal como está, ya que es análogo a git.
fuente
Necesitará un script para recorrerlos. Git no proporciona un "empujar todo". Teóricamente, podría hacer un empuje en múltiples hilos, pero un método nativo no está disponible.
Fetch es aún más complicado, y recomendaría hacerlo linealmente.
Creo que su mejor respuesta es tener una máquina que todos empujen / tiren, si eso es posible.
fuente
Para actualizar los controles remotos (es decir, el
pull
caso), las cosas se han vuelto más fáciles.La declaración de Linus.
en la entrada referenciada en la lista de correo de Git en la respuesta de elliottcable ya no es cierto.
git fetch
aprendí el--all
parámetro en algún lugar del pasado que permite obtener todos los controles remotos de una sola vez.Si no se solicitan todos, uno podría usar el
--multiple
interruptor para especificar múltiples controles remotos o un grupo.fuente
Quería trabajar en VSO / TFS, luego presionar públicamente a GitHub cuando esté listo. Repo inicial creado en VSO privado. Cuando llegó el momento de agregar a GitHub, lo hice:
Trabajó como un campeón ...
Para una verificación de cordura, emita "git remote -v" para enumerar los repositorios asociados con un proyecto.
De manera simple, funcionó para mí ... Espero que esto ayude a alguien.
fuente
git push -f
sin una razón, por ejemplo, fallargit push
o saber exactamente lo que uno está haciendo, es una mala idea y potencialmente dañina. Esto tampoco responde la pregunta, sino cómo agregar un segundo control remoto.agregue un alias a gitconfig global (/home/user/.gitconfig) con el siguiente comando.
Una vez que confirma el código, decimos
para empujar al origen por defecto. Después del alias anterior, podemos decir
y el código se actualizará a todos los controles remotos, incluido el control remoto de origen.
fuente
Agregar el
all
control remoto se vuelve un poco tedioso ya que debe configurarlo en cada máquina que usa.Además, los alias
bash
y siempre que todos asuman que tienes empujarán a todos los controles remotos. (Ej: tengo una bifurcación de eso que mantengo en GitHub y GitLab. Tengo el upstreamgit
sshag
agregado el control remoto , pero no tengo permiso para presionarlo).Aquí hay un
git
alias que solo empuja a controles remotos con una URL de inserción que incluye@
.fuente
fuente