Cambiar el control remoto predeterminado de Git

228

Quiero cambiar el destino predeterminado de la sucursal remota de Git para poder simplemente

git push

En vez de:

git push upstream

Actualmente esto está configurado en el control remoto de origen y quiero configurarlo en un control remoto diferente.

Traté de eliminar el control remoto original (clonado)

git remote rm origin

Lo cual eliminó el control remoto original. Pero no resuelve el git pushproblema. Todavía consigo:

fatal: Sin destino de inserción configurado. Especifique la URL desde la
línea de comandos o configure un repositorio remoto utilizando ...

También intenté jugar con:

git remote set-url --push myfork origin

y otras opciones, pero ninguna parece funcionar (¿tal vez porque eliminé el control remoto de origen demasiado pronto?)

Siguiendo la respuesta aquí intenté cambiar:

git config push.default upstream (or matching)

Pero ninguno funcionó.

alonisser
fuente

Respuestas:

215

Puede usar git push -u <remote_name> <local_branch_name>para establecer el flujo ascendente predeterminado. Consulte la documentación de git push para obtener más detalles.

1615903
fuente
1
No funciona: me sale '' 'fatal:' origen 'no parece ser un repositorio git fatal: el extremo remoto colgó inesperadamente' '' tal vez porque eliminé el origen remoto antes de continuar. acabo de encontrar una solución que funcione, actualizaré en una respuesta
alonisser
34
Como aclaración adicional, la sintaxis debería ser git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri
33
Ejemplo: git push -u origin master:master.
starbeamrainbowlabs
1
Después de configurar un control remoto predeterminado ... ¿de todos modos no puede forzar git pusha empujar la rama remota de la rama local actual? Quiero decir que hacerlo significa que tengo que ejecutar este comando para cada rama. ¿Correcto? ¿No puedo hacer una configuración inicial para todo el repositorio? @MarcoLazzeri
Miel
2
@starbeamrainbowlabs ¿No es git push -u origin mastersuficiente? ¿Estás ilustrando la sintaxis completa?
Josiah Yoder
108

Para cambiar qué control remoto ascendente está "conectado" a su rama, use el git branchcomando con el indicador de configuración ascendente.

Asegúrese de que el control remoto exista primero:

git remote -vv

Establezca el control remoto preferido para la rama actual (desprotegida):

git branch --set-upstream-to <remote-name>

Valide que la rama esté configurada con el control remoto ascendente correcto:

git branch -vv

Jordan McCullough
fuente
2
Solo intenté git branch --set-upstream-to myforky obtuve un error:> error: opción desconocida `set-upstream-to 'Estoy ejecutando git 1.7.9
alonisser
3
La sintaxis cambió en 1.8, consulte stackoverflow.com/questions/520650/…
jtniehof
1
Consulte la siguiente respuesta: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich el
10
git branch -u <remotename>/<branch>trabajó para mi. El comando se ejecutó con la rama de interés local desprotegida. Consulte 'Rastreo de ramas' en git-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio
2
La salida detallada del comando remoto es realmente justa git remote -vo git remote --verbose. La -vvv adicional es redundante.
Artif3x
45

Trabajando con Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Ahora status, pushy pullapuntan a myforkremoto

pinei
fuente
Esto también funciona cuando solo quieres establecer el valor predeterminado pull.
StingyJack
39

Puede cambiar fácilmente el control remoto predeterminado para sucursales de una sola vez usando este comando

git push -u <remote_name> --all
Mykola Denysyuk
fuente
14
Solo para tener en cuenta, esto los empujará a todos, así como a cambiar su control remoto ascendente.
poolie
16

Si lo hizo git push origin -u localBranchName:remoteBranchNamey en git pushcomandos secuenciales , obtiene errores que luego el origen no existe, luego siga estos pasos:

  1. git remote -v

Comprueba si hay algún control remoto que no me importa. Eliminarlos congit remote remove 'name'

  1. git config --edit

Busque posibles signos de un control remoto antiguo / inexistente. Buscar pushdefault:

[remote]
  pushdefault = oldremote

Actualizar oldremotevalor y guardar.

git push Debería funcionar ahora.

Șerban Ghiță
fuente
2
¡Gracias! Tiendo a agregar -ucuando uso git pusha un control remoto diferente debido a la memoria muscular. Esto hace que el control remoto dado sea el predeterminado, volver a configurarlo usando git config --edit(o presionar nuevamente y configurar un nuevo control remoto) resolvió el problema.
Tim Visée
13

Solo una aclaración (usando git versión 1.7.9.5 en ubuntu 12.04):

Git agregará / eliminará controles remotos. Estas son instancias remotas de git con un servidor conectado.

git remote add myremote git://remoteurl

Luego puede buscar dicho repositorio git de esta manera:

git fetch myremote

Parece que esto crea una rama llamada 'myremote', sin embargo, el control remoto para la rama no se configura automáticamente. Para hacer esto, debe hacer lo siguiente:

Primero, verifique que tiene este problema, es decir

git config -l | grep myremote

Deberías ver algo como:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Si ve branch.myremote.remote=., entonces debe continuar:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Ahora debe estar actualizado con el repositorio remoto, y sus tirones / empujes deben estar vinculados al control remoto apropiado. Puede cambiar los controles remotos de esta manera, por rama . [Nota 1]

De acuerdo con la documentación oficial de The Git Config , puede configurar una rama de inserción predeterminada (solo busque remote.pushdefault en esa página), sin embargo, tenga en cuenta que esto no afectará a los repositorios / ramas que ya existen, por lo que esto funcionará, pero solo para nuevos repositorios / sucursales. Debe recordar que --globalestablecerá los valores predeterminados del repositorio específicos del usuario (~ / .gitconfig), --systemestablecerá los valores predeterminados del repositorio en todo el sistema (/ etc / gitconfig), y ningún indicador establecerá las opciones de configuración para el repositorio actual (./.gitconfig).

También debe tenerse en cuenta que la opción de configuración push.default es para configurar el comportamiento de ref-spec , no el comportamiento remoto .

[1]: git branch --set-upstream myotherremotegeneralmente funcionaría aquí, sin embargo, git se quejará de que no se establecerá una rama como su propio control remoto si git branch --set-upstream myremotese usa. Sin embargo, creo que este es un comportamiento incorrecto.

smaudet
fuente
En lugar de git config -l | grep myremote, simplemente puede usar:git config --get branch.myremote.remote
Murmel
@Murmel primero, este es un wiki de la comunidad, así que siéntete libre de mejorar, en segundo lugar, --getasume un comportamiento particular, tomo nota de que hay otras formas de configurar upstreams, pero esto proporciona una forma de encontrar la información sin depender solo de las herramientas git para ser correcto. Git no es perfecto, es mejor comprender los datos, lo que hace y luego esperar que sus invocaciones funcionen adecuadamente.
smaudet el
10

Puede ser útil mirar .git/configdentro de su repositorio, enumerará todos los controles remotos y también el control remoto predeterminado para cada rama

p.ej.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

puede hacer cambios manuales en este archivo para eliminar un control remoto no deseado o actualizar los controles remotos predeterminados para las diferentes ramas que tiene

  • ¡Presta atención! al cambiar o eliminar los controles remotos, asegúrese de actualizar todas las referencias a este en este archivo de configuración
Kim Paulissen
fuente
5

Otra técnica que acabo de encontrar para resolver esto (incluso si eliminé el origen primero, lo que parece ser un error) es manipular git config directamente:

git config remote.origin.url url-to-my-other-remote
alonisser
fuente
55
Esta no es una buena solución, los usuarios de git deberían poder extraer / empujar desde múltiples repositorios, aunque esto le permitirá cambiar el control remoto del original, no significa que DEBE cambiar el control remoto del original, ya que esto probablemente significará que hay Hay una serie de incompatibilidades entre los controles remotos. Combinar ayudará aquí, pero es más simple y conserva más historial para configurar el control remoto en la nueva sucursal.
smaudet
No es la forma correcta de hacerlo ... @ La respuesta de Jordan es más apropiada
Raja Anbazhagan
1
Ver también: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich el
5

Muy simple, y reuniendo algunos de los excelentes comentarios aquí junto con mi propia investigación sobre esto.

Primero, verifique la sucursal local que desea vincular a su sucursal remota:

git checkout mybranch

Próximo:

git branch -u origin/mybranch

dónde:

git branch -u {remote name}/{branch name}

Deberías recibir un mensaje:

"Branch mybranch set up to track remote branch mybranch from origin."
Artif3x
fuente
3

En mi caso, lo solucioné de la siguiente manera: * run git config --edit * En el archivo de configuración de git:

[branch "master"]
remote = origin # <--- change the default origin here
Ron
fuente
0

git remote set-url --push origin debería funcionar, como mencionó, pero debe proporcionar explícitamente la URL en lugar de un nombre remoto alternativo, p. ej.

git remote set-url --push origin [email protected]:contributor/repo.git

Puede confirmar si esto funcionó haciendo un git remote -v. P.ej

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    [email protected]:contributor/testify.git (fetch)
fork    [email protected]:contributor/testify.git (push)
origin  [email protected]:stretchr/testify (fetch)
origin  [email protected]:contributor/testify.git (push)
abejas
fuente