specific - git fetch example
¿"Git fetch--tags" incluye "git fetch"? (6)
El problema general aquí es que git fetch
buscará +refs/heads/*:refs/remotes/$remote/*
. Si alguna de estas confirmaciones tiene etiquetas, esas etiquetas también se buscarán. Sin embargo, si hay etiquetas a las que no puede acceder ninguna rama en el control remoto, no se recuperarán.
La opción --tags
cambia el refspec a +refs/tags/*:refs/tags/*
refs +refs/tags/*:refs/tags/*
. Puedes pedirle a git fetch
que agarre ambos. Estoy bastante seguro de que solo hago un git fetch && git fetch -t
usarías el siguiente comando:
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
Y si desea que esto sea el predeterminado para este repositorio, puede agregar una segunda refspec a la recuperación predeterminada:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
Esto agregará una segunda línea fetch =
en el .git/config
para este control remoto.
Pasé un rato buscando la forma de manejar esto para un proyecto. Esto es lo que se me ocurrió.
git fetch -fup origin "+refs/*:refs/*"
En mi caso quise estas características.
- Agarre todas las cabezas y etiquetas del control remoto, así que use refspec refs
refs/*:refs/*
- Sobrescriba las ramas y etiquetas locales con no avance rápido
+
antes de la refspec - Sobrescribir la rama actualmente extraída si es necesario
-u
- Eliminar ramas y etiquetas no presentes en el control remoto
-p
- Y fuerza para estar seguro
-f
Una pregunta agradable y simple: ¿es la función de "git fetch" un estricto subconjunto de git fetch --tags
?
Es decir, si ejecuto git fetch --tags
, ¿hay alguna razón para ejecutar inmediatamente git fetch
directamente después?
¿Qué hay de git pull
y git pull --tags
? ¿Misma situacion?
En la mayoría de las situaciones, git fetch
debería hacer lo que usted quiere, que es ''obtener algo nuevo del repositorio remoto y colocarlo en su copia local sin fusionarse con sus sucursales locales''. git fetch --tags
hace exactamente eso, excepto que no obtiene nada excepto las nuevas etiquetas.
En ese sentido, git fetch --tags
es de ninguna manera un superconjunto de git fetch
. De hecho, es exactamente lo contrario.
git pull
, por supuesto, no es más que un envoltorio para un git fetch <thisrefspec>; git merge
git fetch <thisrefspec>; git merge
. Se recomienda que se acostumbre a la git fetch
manual de git fetch
y la git merge
antes de dar el salto a git pull
simplemente porque le ayuda a entender qué está haciendo git pull
en primer lugar.
Dicho esto, la relación es exactamente la misma que con git fetch
. git pull
es el superconjunto de git pull --tags
.
Nota: a partir de git 1.9 / 2.0 (Q1 2014) , git fetch --tags
obtiene las etiquetas además de lo que se obtiene con la misma línea de comando sin la opción.
Ver commit c5a84e9 por Michael Haggerty (mhagger) :
Anteriormente, la opción "
--tags
" de--tags
se consideraba equivalente a especificar el refspec
refs/tags/*:refs/tags/*
en la línea de comando; en particular, causó que la configuración del
remote.<name>.refspec
sea ignorada.Pero no es muy útil obtener etiquetas sin obtener también otras referencias, mientras que es muy útil poder obtener etiquetas además de otras referencias.
Así que cambia la semántica de esta opción para hacer lo último.Si un usuario desea obtener solo etiquetas, todavía es posible especificar un refspec explícito:
git fetch <remote> ''refs/tags/*:refs/tags/*''
Tenga en cuenta que la documentación anterior al 1.8.0.3 era ambigua sobre este aspecto del comportamiento de "
fetch --tags
".
Commit f0cb2f1 (2012-12-14)fetch --tags
hizo que la documentación coincida con el comportamiento anterior.
Este compromiso cambia la documentación para que coincida con el nuevo comportamiento (consulteDocumentation/fetch-options.txt
).Solicite que todas las etiquetas se recuperen desde el control remoto además de cualquier otra cosa que se esté recuperando .
Desde Git 2.5 (Q2 2015) git pull --tags
es más robusto:
Ver commit 19d122b por Paul Tan ( pyokagan
) , 13 de mayo de 2015.
(Fusionada por Junio C Hamano - gitster
- in commit cc77b99 , 22 de mayo de 2015)
pull
: eliminar--tags
error en caso de no combinar candidatosDesde 441ed41 ("
git pull --tags
": error con un mensaje mejor., 2007-12-28, Git 1.5.4+),git pull --tags
imprimirá un mensaje de error diferente sigit-fetch
no regresara cualquier combinación de candidatos:
It doesn''t make sense to pull all tags; you probably meant: git fetch --tags
Esto se debe a que en ese momento,
git-fetch --tags
anularía cualquier refspecs configurado, y por lo tanto no habría candidatos de fusión. El mensaje de error fue introducido para evitar confusiones.Sin embargo, desde c5a84e9 (
fetch --tags
: fetch tags además de otras cosas, 2013-10-30, Git 1.9.0+),git fetch --tags
recuperaría tags además de cualquier refspecs configurado.
Por lo tanto, si se produce una situación sin candidatos de fusión, no se debe a que se--tags
establecido--tags
. Como tal, este mensaje de error especial es ahora irrelevante.Para evitar confusiones, elimine este mensaje de error.
Con Git 2.11+ (Q4 2016) git fetch
es más rápido.
Ver commit 5827a03 (13 de octubre de 2016) por Jeff King ( peff
) .
(Combinado por Junio C Hamano - gitster
- in commit 9fcd144 , 26 de octubre de 2016)
fetch
: use "quick"has_sha1_file
para la siguiente etiquetaCuando buscamos en un control remoto que tiene muchas etiquetas que son irrelevantes para las ramas que seguimos, solíamos perder demasiados ciclos al verificar si el objeto al que apunta una etiqueta (¡que no vamos a buscar!) Existe en nuestro repositorio demasiado cuidado
Este parche enseña cómo usar HAS_SHA1_QUICK para sacrificar la precisión por la velocidad, en los casos en los que podríamos ser agresivos con un nuevo empaque simultáneo.
Estos son los resultados del script perf incluido, que configura una situación similar a la descrita anteriormente:
Test HEAD^ HEAD
----------------------------------------------------------
5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
Eso aplica solo para una situación donde:
- Tiene muchos paquetes en el lado del cliente para hacer que
reprepare_packed_git()
costoso (la parte más costosa es encontrar duplicados en una lista sin clasificar, que actualmente es cuadrática).- Necesita un gran número de referencias de etiquetas en el lado del servidor que sean candidatas para el seguimiento automático (es decir, que el cliente no tenga). Cada uno desencadena una re-lectura del directorio del paquete.
- En circunstancias normales, el cliente seguiría automáticamente esas etiquetas y después de una búsqueda grande, (2) ya no sería cierto.
Pero si esas etiquetas apuntan a un historial que está desconectado de lo que el cliente obtiene de otra manera, entonces nunca lo seguirá automáticamente, y esos candidatos lo impactarán en cada búsqueda.
Voy a responder a esto yo mismo.
He determinado que hay una diferencia. "git fetch --tags" puede traer todas las etiquetas, ¡pero no trae ninguna nueva confirmación!
Resulta que uno tiene que hacer esto para estar totalmente "actualizado", es decir, replicar un "git pull" sin la combinación:
$ git fetch --tags
$ git fetch
Esto es una pena, porque es el doble de lento. Si solo "git fetch" tuviera la opción de hacer lo que normalmente hace y traer todas las etiquetas.
Nota: esta respuesta solo es válida para git v1.8 y versiones anteriores.
La mayor parte de esto se ha dicho en las otras respuestas y comentarios, pero aquí hay una explicación concisa:
-
git fetch
todos los encabezados de las sucursales (o todos especificados por la opción de configuración remote.fetch), todas las confirmaciones necesarias para ellos y todas las etiquetas a las que se puede acceder desde estas sucursales. En la mayoría de los casos, todas las etiquetas son accesibles de esta manera. -
git fetch --tags
obtiene todas las etiquetas, todas las confirmaciones necesarias para ellas. No actualizará los encabezados de las sucursales, incluso si son accesibles desde las etiquetas que se buscaron.
Resumen: Si realmente desea estar totalmente actualizado, utilizando solo fetch, debe hacer ambas cosas.
Tampoco es "dos veces más lento" a menos que se refiera a escribir en la línea de comandos, en cuyo caso los alias resuelven su problema. Básicamente, no hay gastos generales al realizar las dos solicitudes, ya que solicitan información diferente.
git fetch upstream --tags
funciona bien, solo obtendrá nuevas etiquetas y no obtendrá ningún otro código base.