¿Cuál es la forma más sencilla de obtener la etiqueta más reciente en Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
salida:
a
b
c
¿Debo escribir un script para obtener la fecha y hora de cada etiqueta y compararlas?
git
git-checkout
git-tag
getlatest
culebrón
fuente
fuente

Respuestas:
Puedes echar un vistazo
git describe, lo que hace algo parecido a lo que estás pidiendo.fuente
--abbrev=0él debería devolver la etiqueta anotada más cercanagit describe --exact-match --abbrev=0.git describe --tagsy comparar com última etiqueta en la página de lanzamiento de githubPara obtener la etiqueta más reciente:
Para obtener la etiqueta anotada más reciente :
fuente
git describedice la página del manual :--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.git describe --tagsgit checkout $(git describe --abbrev=0 --tags)Producirá la etiqueta del último commit etiquetado en todas las ramas
fuente
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))@ william-pursellPara obtener la etiqueta más reciente, puede hacer:
Por supuesto, puede cambiar el argumento de conteo o el campo de clasificación según lo desee. Parece que es posible que haya querido hacer una pregunta ligeramente diferente, pero esto responde la pregunta tal como la interpreto.
fuente
--sort=-authordatey--sort=authordate.--sort=-taggerdate. Para las etiquetas,authordateycommitterdateestán vacías (tan inútiles como las claves de clasificación).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1es aún mejor :)--points-at=$SHAle dará la etiqueta para un hash de confirmación.¿Qué tal esto?
TAG=$(git describe $(git rev-list --tags --max-count=1))Técnicamente, no necesariamente obtendrá la última etiqueta, sino la última confirmación que está etiquetada, que puede o no ser lo que está buscando.
fuente
--tags=<pattern>enrev-list. Por ejemplo, obtenga la última etiqueta de versióngit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)git describe --tags $(git rev-list --tags --max-count=1)Puede ejecutar:
git describe --tags $(git rev-list --tags --max-count=1)hablado aquí: ¿Cómo obtener el último nombre de etiqueta?fuente
git describe ...devuelve una etiqueta anterior ?!)--abbrev=0respuestas y cortaron parte de la etiqueta que quiero."Más reciente" podría tener dos significados en términos de git.
Podría decir, "qué etiqueta tiene la fecha de creación más reciente en el tiempo", y la mayoría de las respuestas aquí son para esa pregunta. En términos de su pregunta, le gustaría devolver la etiqueta
c.O podría decir "qué etiqueta es la más cercana en el historial de desarrollo a alguna rama con nombre", generalmente la rama en la que se encuentra,
HEAD. En su pregunta, esto devolvería la etiquetaa.Estos pueden ser diferentes, por supuesto:
Imagine que el desarrollador etiquetó
Zcomov0.2el lunes y luego etiquetóQcomov0.1el martes.v0.1es el más reciente, perov0.2está más cerca en la historia del desarrollo de HEAD, en el sentido de que el camino en el que se inicia comienza en un punto más cercano a HEAD.Creo que generalmente quieres esta segunda respuesta, más cerca en la historia del desarrollo. Puede averiguarlo utilizando
git log v0.2..HEADetc. para cada etiqueta. Esto le da el número de confirmaciones en HEAD desde que la ruta termina env0.2divergió de la ruta seguida por HEAD.Aquí hay un script de Python que lo hace iterando a través de todas las etiquetas que ejecutan esta verificación y luego imprimiendo la etiqueta con la menor cantidad de confirmaciones en HEAD ya que la ruta de la etiqueta divergió:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describehace algo ligeramente diferente, en el sentido de que rastrea desde (por ejemplo) HEAD para encontrar la primera etiqueta que está en un camino hacia atrás en el historial desde HEAD. En términos de git,git describebusca etiquetas que sean "accesibles" desde HEAD. Por lo tanto, no encontrará etiquetas comov0.2esa que no estén en el camino de regreso de HEAD, sino en un camino que se separó de allí.fuente
git describe --tagsdevuelve la última etiqueta que puede ver la rama actual
fuente
SI NECESITA MÁS DE UNA ÚLTIMA ETIQUETA
(git describe --tags a veces da hashes incorrectos, no sé por qué, pero para mí --max-count 2 no funciona)
así es como puede obtener la lista con los últimos 2 nombres de etiquetas en orden cronológico inverso, funciona perfectamente en git 1.8.4. Para versiones anteriores de git (como 1.7. *), No hay una cadena "tag:" en la salida: simplemente elimine la última llamada sed
Si desea más de 2 últimas etiquetas, cambie este "sed 2q" a "sed 5q" o lo que necesite
Luego puede analizar fácilmente cada nombre de etiqueta a variable más o menos.
fuente
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'donde en%Dexcluye los()caracteres que lo rodean , y elseds que comienza 5q deja 4 líneas antes de 5, luego imprime todos los caracteres entre 'tag: `y el primero', '. Entonces ... suponiendo que no se usen comas dentro de la etiqueta, esto funciona perfectamente.¿Qué hay de malo con todas las sugerencias (excepto la explicación de Matthew Brett , actualizada de esta publicación de respuestas)?
Simplemente ejecute cualquier comando proporcionado por otro en el historial de jQuery Git cuando esté en un punto diferente del historial y verifique el resultado con la representación visual del historial de etiquetado (lo hice por eso es que ve esta publicación):
Hoy en día, muchos proyectos realizan lanzamientos (y, por lo tanto, etiquetado) en una rama separada de la línea principal .
Hay una fuerte razón para esto. Simplemente busque cualquier proyecto JS / CSS bien establecido. Para convenciones de usuarios, llevan archivos de lanzamiento binarios / minificados en DVCS. Naturalmente, como mantenedor del proyecto, no desea desechar su historial de diferencias de la línea principal con blobs binarios inútiles y realizar la confirmación de los artefactos de compilación fuera de la línea principal .
Debido a que Git usa DAG y no un historial lineal, es difícil definir la métrica de distancia, por lo que podemos decir: oh, esa revolución es la más cercana a
HEAD!Comienzo mi propio viaje en (mira adentro, no copié imágenes de prueba elegantes en esta larga publicación):
¿Cuál es la etiqueta más cercana en el pasado con respecto a la ramificación en Git?
Actualmente tengo 4 definiciones razonables de distancia entre etiqueta y revisión con disminución de utilidad:
HEADa base de fusión con la etiquetaHEADy etiquetaNo sé cómo calcular la longitud del camino más corto .
Script que ordena las etiquetas según fecha de la base de fusión entre
HEADy la etiqueta:Se puede usar en la mayoría de los proyectos.
Script que clasifica las etiquetas de acuerdo con el número de revoluciones a las que se puede acceder desde HEAD pero no se puede acceder desde la etiqueta:
Si el historial de su proyecto tiene fechas extrañas en las confirmaciones (debido a rebases u otra reescritura del historial o algún imbécil se olvida de reemplazar la batería del BIOS u otras magias que hace en el historial) use el script anterior.
Para la última opción ( fecha de etiqueta independientemente base de fusión ) para obtener una lista de etiquetas ordenadas por uso de fecha:
Para conocer la fecha de revisión actual, use:
Tenga en cuenta que
git describe --tagstiene uso en sus propios casos, pero no para encontrar la etiqueta humana más cercana esperada en el historial del proyecto .NOTA Puede usar las recetas anteriores en cualquier revisión, ¡simplemente reemplace
HEADcon lo que quiera!fuente
git describe --abbrev=0 --tagsSi no ve la última etiqueta, asegúrese de buscar el origen antes de ejecutar eso:
git remote updatefuente
Obtenga la última etiqueta con el prefijo "ac" . Por ejemplo, etiqueta nombrada con
ac1.0.0oac1.0.5. Otras etiquetas con nombre1.0.0,1.1.0serán ignorados.Obtenga la última etiqueta, cuyo primer carácter es
0-9. Entonces, esas etiquetas con el primer caráctera-zserán ignoradas.Más información
Actualizar
Con
git tag --help, sobre elsortargumento. Se usarálexicorgraphic orderpor defecto, si latag.sortpropiedad no existe.Después de google, alguien dijo que el soporte de git 2.8.0 seguía la sintaxis.
fuente
fuente
Lo siguiente funciona para mí en caso de que necesite las últimas dos etiquetas (por ejemplo, para generar un registro de cambios entre la etiqueta actual y la etiqueta anterior). Lo probé solo en situaciones donde la última etiqueta fue
HEAD.Se adapta a mis necesidades, pero como no soy un mago git, estoy seguro de que podría mejorarse aún más. También sospecho que se romperá en caso de que el historial de confirmación avance. Solo estoy compartiendo en caso de que ayude a alguien.
fuente
Mi primer pensamiento es que podría usar
git rev-list HEAD, que enumera todas las revoluciones en orden cronológico inverso, en combinación congit tag --contains. Cuando encuentra una referencia dondegit tag --containsproduce una lista no vacía, ha encontrado las etiquetas más recientes.fuente
Si desea encontrar la última etiqueta que se aplicó en una rama específica, puede intentar lo siguiente:
fuente
Si necesita un revestimiento único que obtenga el último nombre de etiqueta (por fecha de etiqueta) en la rama actual :
Usamos esto para establecer el número de versión en la configuración.
Ejemplo de salida:
Funciona también en Windows.
fuente
-bash: syntax error near unexpected token '('--format="%(refname:short)") y omito--points-at=HEAD, funciona. Con ese último interruptor, no devuelve nada, supongo porque miHEADno está etiquetado.HEADno está etiquetado.Este es un hilo viejo, pero parece que a muchas personas les falta la respuesta más simple, fácil y correcta a la pregunta de OP: para obtener la última etiqueta para la rama actual , usa
git describe HEAD. Hecho.Editar: también puede proporcionar cualquier nombre de referencia válido, incluso controles remotos; es decir,
git describe origin/masterle indicará la última etiqueta a la que se puede acceder desde origen / maestro.fuente
for-each-refcomando ( stackoverflow.com/a/5261470/515973 ) y la combinación derev-listydescribe( stackoverflow.com/a/7979255/515973 )git describe branchname --tagsfunciona para mí obtener la última etiqueta en la rama (git versión 2.12.2)Para obtener la última etiqueta solo en el nombre de la rama / etiqueta actual que tiene prefijos con la rama actual, tuve que ejecutar lo siguiente
Y mi necesidad final de incrementar y obtener la etiqueta +1 para el próximo etiquetado.
fuente
Para la pregunta que se le hizo,
usted quiere
--first-parentle dice quegit logno detalle ninguna historia fusionada, le--pretty=%ddice que muestre solo las decoraciones, es decir, los nombres locales para cualquier confirmación.grep -m1dice "coincide solo con uno", por lo que obtienes la etiqueta más reciente.fuente
Si sus etiquetas son ordenables:
fuente
No hay mucha mención de etiquetas no anotadas versus etiquetas anotadas aquí. 'describe' funciona en etiquetas anotadas e ignora las no anotadas.
Esto es feo pero cumple con el trabajo solicitado y no encontrará ninguna etiqueta en otras ramas (y no en la especificada en el comando: master en el ejemplo a continuación)
El filtrado debería ser optimizado (consolidado), pero nuevamente, esto parece ser el trabajo.
Las críticas son bienvenidas ya que voy a poner esto en uso :)
fuente
Otra forma sencilla de obtener el último nombre de etiqueta es con
o
para almacenarlo en una variable.
git tagenumera todas las etiquetas disponibles y devolverá la última fila si el resultado.tail-1fuente