¿Cuál es la diferencia entre una etiqueta con anotaciones y una sin anotaciones?

Resuelto user462301 asked hace 12 años • 0 respuestas

Si quiero etiquetar el compromiso actual. Sé que las siguientes líneas de comando funcionan:

git tag <tagname>

y

git tag -a <tagname> -m '<message>'

¿Cuál es la diferencia entre estos comandos?

user462301 avatar Jul 17 '12 06:07 user462301
Aceptado

TL;DR

La diferencia entre los comandos es que uno le proporciona un mensaje de etiqueta mientras que el otro no. Una etiqueta anotada tiene un mensaje que se puede mostrar con git-show(1), mientras que una etiqueta sin anotaciones es solo un puntero con nombre a una confirmación.

Más información sobre etiquetas ligeras

Según la documentación : "Para crear una etiqueta liviana, no proporcione ninguna de las opciones -a, -s o -m, solo proporcione un nombre de etiqueta". También hay algunas opciones diferentes para escribir un mensaje en etiquetas anotadas:

  • Cuando use git tag <tagname>, Git creará una etiqueta en la revisión actual pero no le solicitará una anotación. Se etiquetará sin mensaje (esta es una etiqueta liviana).
  • Cuando use git tag -a <tagname>, Git le solicitará una anotación a menos que también haya usado el indicador -m para proporcionar un mensaje.
  • Cuando uses git tag -a -m <msg> <tagname>, Git etiquetará la confirmación y la anotará con el mensaje proporcionado.
  • Cuando use git tag -m <msg> <tagname>, Git se comportará como si hubiera pasado el indicador -a para realizar anotaciones y usara el mensaje proporcionado.

Básicamente, solo se trata de si desea que la etiqueta tenga una anotación y alguna otra información asociada o no.

Todd A. Jacobs avatar Jul 16 '2012 23:07 Todd A. Jacobs

Inserte etiquetas anotadas y mantenga el nivel local ligero

man git-tagdice:

Las etiquetas anotadas están destinadas a su publicación, mientras que las etiquetas ligeras están destinadas a etiquetas de objetos privados o temporales.

Y ciertos comportamientos los diferencian de manera que esta recomendación es útil, por ejemplo:

  • Las etiquetas anotadas pueden contener un mensaje, un creador y una fecha diferentes a la confirmación a la que apuntan. Por lo tanto, podría usarlos para describir un lanzamiento sin realizar una confirmación de lanzamiento.

    Las etiquetas ligeras no tienen esa información adicional y no la necesitan, ya que solo la usará usted mismo para desarrollar.

  • git push --follow-tags solo enviará etiquetas anotadas
  • git describesin opciones de línea de comando solo ve etiquetas anotadas

Diferencias internas

  • Tanto las etiquetas ligeras como las anotadas son un archivo .git/refs/tagsque contiene un SHA-1

  • para etiquetas ligeras, SHA-1 apunta directamente a una confirmación:

    git tag light
    cat .git/refs/tags/light
    

    imprime lo mismo que el SHA-1 del HEAD.

    Así que no es de extrañar que no puedan contener ningún otro metadato.

  • Las etiquetas anotadas apuntan a un objeto de etiqueta en la base de datos de objetos.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    contiene el SHA del objeto de etiqueta anotado:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    y luego podemos obtener su contenido con:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    salida de muestra:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Y así es como contiene metadatos adicionales. Como podemos ver en el resultado, los campos de metadatos son:

    • el objeto al que apunta
    • el tipo de objeto al que apunta. Sí, los objetos de etiqueta pueden apuntar a cualquier otro tipo de objeto, como blobs, no solo a confirmaciones .
    • el nombre de la etiqueta
    • identidad del etiquetador y marca de tiempo
    • mensaje. Observe cómo la firma PGP simplemente se agrega al mensaje.

    Un análisis más detallado del formato está presente en: ¿ Cuál es el formato de un objeto de etiqueta git y cómo calcular su SHA?

Bonificaciones

  • Determinar si una etiqueta está anotada:

    git cat-file -t tag
    

    Salidas

    • commitpara peso ligero, dado que no hay ningún objeto de etiqueta, apunta directamente a la confirmación
    • tagpara anotado, ya que hay un objeto de etiqueta en ese caso
  • Enumere solo etiquetas livianas: ¿Cómo puedo enumerar todas las etiquetas livianas?

La gran diferencia está perfectamente explicada aquí .

Básicamente, las etiquetas ligeras son sólo indicadores de confirmaciones específicas. No se guarda más información ; Por otro lado, las etiquetas anotadas son objetos regulares , que tienen un autor y una fecha y pueden ser referenciados porque tienen su propia clave SHA.

Si saber quién etiquetó qué y cuándo es relevante para usted, utilice etiquetas anotadas. Si solo desea etiquetar un punto específico de su desarrollo , sin importar quién y cuándo lo hizo, entonces las etiquetas livianas son lo suficientemente buenas.

Normalmente, optaría por etiquetas anotadas, pero en realidad depende del maestro de Git del proyecto.

Luis avatar Apr 04 '2015 19:04 Luis