Poda automática con Git fetch o pull

248

Si alguien eliminó una rama remota porque el trabajo ha terminado y no lo sé, no haré una git fetch --pruney eventualmente rechazaré la rama eliminada.

¿Existe una solución viable para forzar a Git a usar el modo de poda al buscar / extraer sin tener que especificarlo cada vez?

Edmondo1984
fuente
1
Usted pronto (Git 1.8.5, Q4 2013) ser capaz de especificar en la configuración local de una cesión temporal que desea siempre podar en git fetch! Vea mi respuesta a continuación
VonC

Respuestas:

395

Desde git 1.8.5 (cuarto trimestre de 2013) :

" git fetch" (por lo tanto, " git pull" también) aprendió a verificar las variables de configuración " fetch.prune" y " remote.*.prune" y a comportarse como si se hubiera --prunedado la opción de línea de comando " ".

Eso significa que, si configuras remote.origin.prune en true:

git config remote.origin.prune true

Cualquiera git fetcho git pullse podará automáticamente.

Nota: Git 2.12 (Q1 2017) solucionará un error relacionado con esta configuración, lo que haría que se git remote renamecomportara mal.
Consulte " ¿Cómo cambio el nombre de un control remoto de git? ".


Ver más en commit 737c5a9 :

Sin " git fetch --prune", las ramas de seguimiento remoto para una rama que el otro lado ya ha eliminado permanecerán para siempre.
Algunas personas siempre quieren correr " git fetch --prune".

Para acomodar a los usuarios que desean podar siempre o al buscar desde un control remoto en particular, agregue dos nuevas variables de configuración " fetch.prune" y " remote.<name>.prune":

  • " fetch.prune" permite habilitar la eliminación de todas las operaciones de recuperación.
  • " remote.<name>.prune" permite cambiar el comportamiento por control remoto.

Este último anulará naturalmente al primero, y la --[no-]pruneopción de la línea de comando anulará el valor predeterminado configurado.

Dado que --prunees una operación potencialmente destructiva (Git todavía no mantiene los registros de registros para las referencias eliminadas), no queremos eliminar sin el consentimiento de los usuarios, por lo que esta configuración no estará activada de forma predeterminada.

VonC
fuente
44
De hecho, esto está incluido en el ahora lanzado git 1.8.5
Bessey
1
Quiero este comportamiento por defecto en todos mis repositorios git. ¿Hay algún lugar donde pueda poner esto en mi .gitconfig para que eso suceda?
Andrew
47
@Andrew un buen comienzo seríagit config --global fetch.prune true
VonC
1
¿Cuáles son las posibles desventajas de podar siempre en pull? la cita menciona que el historial de reflog se ve afectado ... pero, ¿qué problema práctico podría presentar?
Grapho
3
@Grapho no tiene ningún inconveniente, pero ... ver más en stackoverflow.com/a/39862779/6309
VonC
143

git config --global fetch.prune true

Para siempre --prunepara git fetchy git pullen todos sus repositorios de Git:

git config --global fetch.prune true

Este comando anterior agrega en su configuración global de Git (típicamente ~/.gitconfig) las siguientes líneas. Use git config -e --globalpara ver su configuración global.

[fetch]
    prune = true

git config remote.origin.prune true

Para siempre --prunepero desde un único repositorio:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Este comando anterior agrega en su configuración local de Git (típicamente .git/config) la última línea a continuación. Use git config -epara ver su configuración local.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

También puede usar --globaldentro del segundo comando o usar en su lugar --localdentro del primer comando.


git config --global gui.pruneDuringFetch true

Si lo usa git gui, también puede interesarle:

git config --global gui.pruneDuringFetch true

que anexa:

[gui]
    pruneDuringFetch = true

Referencias

Las documentaciones correspondientes de git help config:

--global

  Para opciones de escritura: escriba en el ~/.gitconfigarchivo global en lugar del repositorio .git/config, escriba en el $XDG_CONFIG_HOME/git/configarchivo si este archivo existe y el ~/.gitconfigarchivo no.

 

--local

  Para escribir opciones: escriba en el .git/configarchivo del repositorio . Este es el comportamiento predeterminado.

 

fetch.prune

  Si es verdadero, fetch se comportará automáticamente como si la --pruneopción se hubiera dado en la línea de comando. Ver también remote.<name>.prune.

 

gui.pruneDuringFetch

  "verdadero" si git-gui debe podar ramas de seguimiento remoto al realizar una búsqueda. El valor predeterminado es "falso".

 

remote.<name>.prune

  Cuando se establece en verdadero, la recuperación desde este control remoto de forma predeterminada también eliminará cualquier referencia de seguimiento remoto que ya no exista en el control remoto (como si la --pruneopción se hubiera dado en la línea de comando). Anula la fetch.pruneconfiguración, si la hay.

olibre
fuente
1
Nota al margen: acabo de enterarme de esta publicación git config -ey git config -e --globalde esta. No más vimcomandos de tipeo para apuntar a una ruta específica a un archivo de configuración de git, y tener que pensar cuál es esa ruta específica.
ecbrodie
1
Ahora ESTA es una respuesta con la que puedes trabajar. Muchas gracias.
sebingel
Esta respuesta es bastante completa, pero muy difícil de leer debido a su formato. Había encontrado "Para siempre - podar para git fetch y git pull en todos sus repositorios de Git: git config --global fetch.prune true" igual de bueno (con un enlace a los documentos relevantes).
Thibaud Colas
19

Si quieres siempre prunecuando lo hagas fetch, puedo sugerirte usar Alias .

Simplemente escriba git config -epara abrir su editor y cambie la configuración para un proyecto específico y agregue una sección como

[alias]
pfetch = fetch --prune   

el cuando vayas a buscar con git pfetchla ciruela se hará automáticamente.

Gracias por todo el pescado
fuente
Entiendo. Pull por cierto usará git fetch y no git pfetch ... ¿debería tener un alias directamente para pull?
Edmondo1984
1
Voy a. De esta manera, usted tiene dos opciones, normales pully fetchy su versión podado. En realidad, creo (pero no lo he probado) se puede escribir fetch = fetch --prunedirectamente en la sección de alias y, por tanto, pulla utilizar el podado recupere automáticamente
ThanksForAllTheFish
2
Por lo que sé fetch = fetch --prune, no funciona, sobrescribir un comando con un alias no funcionó para mí. Esto podría ser porque estoy usando una versión anterior (1.7.2.5)
Uipko
3
De la documentación de configuración de git: "Para evitar confusiones y problemas con el uso del script, se ignoran los alias que ocultan los comandos Git existentes".
Dewayne Christensen