¿Cómo configurar git push para que se configure automáticamente en sentido ascendente sin -u?

100

Quiero git push originestablecer automáticamente la referencia ascendente cuando empujo una rama creada localmente por primera vez.

Lo sé git push -u, pero no quiero tener que pensar si lo he usado -uantes o si establecí una referencia ascendente. En otras palabras, quiero git pushtener automáticamente el efecto de git push -uen cualquier push de una rama que aún no tenga un upstream.

es posible? Si requiere un alias o un script de utilidad, está bien.

Juan
fuente
2
¿Ha comprobado si es posible usar las opciones push.defaulty branch.<name>.mergeen git-config (1) ?
5
Me he push.defaultfijado en current- así es como puedo decir git push originsin refspec o upstream. Pero no ayuda a configurar automáticamente el upstream.
Juan

Respuestas:

61

Puedes configurarlo git configusando git config --global push.default current.

Documentos: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault

Andrea Bergonzo
fuente
8
Tengo ese conjunto, así es como puedo decir git push originsin refspec o upstream. Pero no ayuda a configurar automáticamente el upstream.
John
Funciona para mí: +1:
Tim Strijdhorst
Sí, como dice @John, es importante tener en cuenta que esto no hace que la sucursal local rastree la remota; simplemente crea la rama remota con el mismo nombre que la local.
waldyrious
Lo suficientemente bueno si solo lo necesita push, por ejemplo, solo hay un desarrollador en su rama, que solo edita una copia de un repositorio.
superarts.org
26

Como no creo que esto sea posible usando git config, esto es lo que puede hacer en bash:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

Si la rama actual tiene una rama de seguimiento remoto, llama; de lo git pushcontrario, llama git push -u

pez mecanico
fuente
24
Ahora puedes hacerlo git config --global push.default current.
Andrea Bergonzo
2
@AndreaBergonzo esta es la única buena respuesta para mí, ¿puedes agregarla como respuesta?
pdem
6
@AndreaBergonzo, @pdem: tenga en cuenta que push.default=currentsolo crea una rama en el repositorio remoto con el mismo nombre que la rama local, pero no configura la rama local para rastrear la remota. No estoy seguro de por qué es así, pero vale la pena tenerlo en cuenta.
waldyrious
22

Nota: el hecho de que la nueva política de inserción predeterminada " simple" se base en que una rama tenga una rama ascendente significa que: la
configuración de una rama ascendente se considera un paso voluntario, no un paso automatizado oculto

Cuando " git push [$there]" no dice qué empujar, hemos utilizado la semántica tradicional de "coincidencia" hasta ahora (todas sus ramas se enviaron al control remoto siempre que ya haya ramas con el mismo nombre allí).

Usaremos la " simple" semántica que empuja la rama actual a la rama con el mismo nombre, solo cuando la rama actual está configurada para integrarse con esa rama remota .
Hay una variable de configuración de preferencias del usuario " push.default" para cambiar esto.


Así que construyendo a partir de Mechanicalfish 's respuesta , se puede definir un alias, con las comillas dobles derecha ( ") escapado ( \"):

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

Sc0ttyD propone en los comentarios el siguiente alias:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

En varias líneas:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'
VonC
fuente
1
Gracias por mostrarnos cómo configurar el alias. Sin embargo, no tengo clara la conexión o la relevancia de la primera parte de su respuesta.
Juan
2
@John, mi punto es: evitarías un paso que se supone que es intencional. Puede configurar ese alias, pero quería dejar en claro a otros lectores por qué -uexiste esta opción explícita y por qué no hay una configuración para hacer que dicha opción sea automática (de ahí el alias).
VonC
2
Tengo una lista de alias de zsh en mi .zshrc. alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Modifiqué
2
@ Sc0ttyD Interesante, gracias. He incluido su comentario en la respuesta para mayor visibilidad.
VonC
17

Tuve el mismo problema. Encontré este alias (.gitconfig)

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

Uso: git trackuna vez por nueva rama (actualmente revisada). Luego solo empuja como de costumbre :)

Frexuz
fuente
15

Las respuestas de @VonC y @Frexuz son útiles, pero ambas soluciones me producen un error. Usando sus dos respuestas, improvisé algo que funciona para mí:

    [alias]
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push

Esto da como resultado la ejecución de git push -u origin $BRANCHNAMEo git push, dependiendo de si su (propiedad branch.$BRANCHNAME.merge) ascendente está definida.

Ingresar este alias en la línea de comando requerirá códigos de escape, por lo que probablemente sea más fácil usar un editor para insertarlo en el archivo correcto ( $HOME/.gitconfig(global), .git/config(local) o /etc/gitconfig(sistema))

marca
fuente
3
Esta es la respuesta más sencilla y completa. Para abrir el editor predeterminado sin buscar el archivo, puede git config --global -e
hacerlo
5

Respuesta corta

Si realmente desea ser explícito y usar la -uopción cuando sea necesario, pero simplemente no quiere escribir todo:

git push -u origin foo

Entonces puedes usar el siguiente alias:

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Y simplemente escriba:

git push-u

Respuesta larga

Por lo general, la necesidad de -u(abreviatura de --set-upstream) es cuando acabamos de crear una nueva rama local y comprometernos, y queremos impulsarla hacia arriba. El repositorio remoto aún no tiene la nueva rama, por lo que necesitamos decirle a git que cree y rastree la rama remota antes de presionar la confirmación. Esto solo es necesario para el primer empujón en la rama. Este es un escenario típico:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

Personalmente, me gusta la necesidad de ser explícito git push -ual crear la rama remota: es una operación bastante significativa, compartir una rama completamente nueva con el mundo.

Sin embargo, odio que tengamos que escribir explícitamente git push -u origin foo. No solo es complicado escribir, sino que, lo que es más importante, ¡es bastante propenso a errores! Es fácil cometer un error al escribir el nombre de la rama, ¡y la nueva rama remota no tendrá el mismo nombre que la rama local! En la mayoría de los casos, realmente, desea que el repositorio ascendente sea originy la rama ascendente tenga el mismo nombre que su rama local.

Por lo tanto, estoy usando el siguiente alias en my .gitconfig, que es un subconjunto de la excelente respuesta proporcionada por Mark :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Ahora, podemos hacer lo siguiente, que sigue siendo explícito, pero menos propenso a errores:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit
Boris Dalstein
fuente
4

Resolví este problema usando este sencillo script Bash. No funcionará en las ramas existentes, pero si crea todas sus ramas con esta función, siempre tendrá su rama ascendente configurada automáticamente.

function con { git checkout -b $1 && git push --set-upstream origin $1; }

El $ 1 representa el primer argumento después de pasar por conlo que es como hacer:

git checkout -b my-new-branch && git push -u my-new-branch

... simplemente haciendo esto:

con my-new-branch
JT Jobe
fuente
2

Simplemente:

$ alias gush="git push -u origin HEAD"
Djanowski
fuente
2
Título de la pregunta: "¿Cómo configurar git push para que se configure automáticamente en sentido ascendente sin -u?" Descripción: "Lo sé git push -u, pero ...". Entonces esto no responde a la pregunta.
John
2
@John Actualicé mi respuesta para sugerir un alias simple.
djanowski
2
@John ¿Responde a la pregunta ahora?
djanowski
1
@ ILI4SK4RIM Gracias, es una locura que mi respuesta sea la más simple, pero es -1 ¯_ (ツ) _ / ¯
djanowski
1

Si desea usar las funciones integradas de git solo con las claves menos posibles, simplemente escriba:

$ git push -u o tab H tab

y el autocompletar te dará $ git push -u origin HEAD

Para habilitar autocomplatar en OSX, configure un ~/.git-completition.basharchivo con este contenido y agregue las siguientes líneas a su ~/.bash_profilearchivo y reinicie su terminal:

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

También afecta a los terminales integrados, como el de vscode, etc.

gazdagergo
fuente
autocompletar? git no tiene autocompletar. Su shell (bash? Zsh?) Tiene un conjunto de reglas de autocompletar cargadas. ¿Puede proporcionar información sobre qué conjunto de reglas de autocompletar está utilizando y dónde obtenerlas?
vy32
Oh, de hecho gracias. Completé mi respuesta con mi configuración de autocompletar.
gazdagergo
Sin conocer el contenido de su archivo ~ / .git-completacion.bash, su respuesta no es operacional.
vy32
1
Buen punto. Encontré la fuente de mi git-completition.bashy agregué a mi respuesta.
gazdagergo