2011-02-11 12 views
276

Cambié de Subversion a Git como mi VCS diario el año pasado y todavía estoy tratando de captar los puntos más delicados de "Git-think".¿Por qué debería preocuparme por las etiquetas ligeras y anotadas?

El que me ha estado molestando últimamente es "ligero" contra las etiquetas anotadas contra las firmadas. Parece bastante universalmente aceptado que las etiquetas anotadas son superiores a las etiquetas ligeras para todos los usos reales, pero las explicaciones que he encontrado de por qué ese es el caso siempre parecen reducirse a "because best practices" o "because they're different". Desafortunadamente, esos son argumentos muy insatisfactorios sin saber por qué son las mejores prácticas o cómo esas diferencias son relevantes para mi uso de Git.

Cuando cambié por primera vez a Git, las etiquetas livianas parecían ser lo mejor desde el pan rebanado; Podría señalar un compromiso y decir "eso fue 1.0". Tengo problemas para entender cómo una etiqueta podría necesitar ser más que eso, pero ciertamente no puedo creer que los expertos de Git en el mundo prefieran las etiquetas anotadas arbitrariamente. Entonces, ¿qué es todo el alboroto?

(puntos de bonificación: ¿Por qué alguna vez tenga que firmar una etiqueta?)

EDITAR

He estado successfully convinced etiquetas que anotados es buena cosa - a sabiendas de que ha marcado y cuando ¡es importante! Como seguimiento, ¿algún consejo sobre buenas anotaciones de etiquetas? Tanto git tag -am "tagging 1.0" 1.0 como tratando de resumir el registro de compromiso ya que la etiqueta anterior parece perder estrategias.

+0

posible duplicado de [¿En qué circunstancias se añaden las -a bandera al comando tag git?] (http://stackoverflow.com/questions/4092640/in-what-circumstances-should-i-add-the-a-flag-to-the-git-tag-command) –

+0

¿Encontró una buena respuesta para su seguimiento? ¿Algo como? 'git log --pretty = oneline master..HEAD | git tag -a -F - $ BRANCH. $ BUILD_NUMBER' – dalore

+0

Resumir el registro de confirmación ya que la etiqueta anterior me parece una excelente estrategia para los mensajes de etiqueta. – rooby

Respuesta

213

La gran ventaja de una etiqueta anotada es que usted sabe quién la creó. Al igual que con commits, a veces es bueno saber quién lo hizo. Si eres desarrollador y ves que v1.7.4 ha sido etiquetado (declarado listo) y no estás tan seguro, ¿con quién hablas? ¡La persona cuyo nombre está en la etiqueta anotada! (Si vives en un mundo desconfiado, esto también evita que las personas se salgan con la suya etiquetando cosas que no deberían). Si eres un consumidor, ese nombre es un sello de autoridad: es Junio ​​Hamano diciendo que esta versión de git está aquí liberado.

Los otros metadatos también pueden ser útiles; a veces es bueno saber cuándo se lanzó esa versión, no solo cuando se realizó la confirmación final. Y a veces el mensaje puede ser útil. Tal vez esto ayude a explicar el propósito de esa etiqueta en particular. Tal vez la etiqueta para un candidato de lanzamiento contiene un poco de una lista de estado/tareas.

Las etiquetas de firma son casi como firmar cualquier otra cosa: proporcionan un nivel más de seguridad para el paranoico. La mayoría de nosotros nunca la usaremos, pero si realmente quiere verificar todo antes de poner ese software en su computadora, es posible que lo desee.

Editar:

En cuanto a lo de escribir en una anotación de etiqueta, tienes razón - no hay siempre mucho más útil que decir. Para una etiqueta de número de versión, se entiende implícitamente que marca esa versión, y si está contento con sus registros de cambios en otro lugar, no hay necesidad de poner uno allí. En este caso, es realmente el etiquetador y la fecha los más importantes. La única otra cosa que puedo pensar es algún tipo de sello de aprobación de un banco de pruebas. Eche un vistazo a las etiquetas de git.git: todas dicen algo como "Git 1.7.3 rc1"; lo único que realmente nos importa es el nombre de Junio ​​Hamano en ellos.

Sin embargo, para las etiquetas con nombres menos evidentes, el mensaje podría llegar a ser mucho más importante. Podría imaginar etiquetar una versión específica de propósito especial para un único usuario/cliente, algún hito importante que no sea de la versión, o (como se mencionó anteriormente) un candidato de lanzamiento con información adicional. El mensaje es mucho más útil.

+4

solo para comparar con SVN, ya que el OP proviene de ese sistema: la etiqueta anotada los metadatos son equivalentes al cambio SVN real que hace la rama de la etiqueta, que en SVN tiene su propio autor y mensaje. Y, potencialmente, separa las restricciones sobre quién puede crear una etiqueta, distinto de quién puede controlar los cambios, una distinción que es irrelevante si solo estás usando el sistema para tus propias cosas. – araqnid

+8

Ah-ha! Parece que mi entendimiento aquí fue obstaculizado por el hecho de que todos mis proyectos de Git hasta ahora han sido solo. Nunca he necesitado saber a quién culpar por algo (¡siempre soy yo!), Así que no me había dado cuenta de que las etiquetas livianas no rastrean al etiquetador. –

+4

'git help log' ahora resume esto como:" Las etiquetas anotadas están pensadas para ser lanzadas, mientras que las etiquetas ligeras son para etiquetas de objetos privados o temporales. " –

21

De manera predeterminada, Git solo mira las etiquetas anotadas como una línea base para comandos como git describe. Piense en las etiquetas anotadas como indicadores que tienen un significado duradero para usted y para los demás, mientras que las etiquetas de peso ligero son más como marcadores para que su yo posterior las encuentre. Por lo tanto, vale la pena usar etiquetas anotadas como referencia, mientras que las etiquetas ligeras no deberían serlo.

Firmar una etiqueta es una garantía de la identidad del firmante. Permite a los usuarios verificar, por ejemplo, que el código del kernel de Linux que han recogido es el mismo que Linus Torvalds lanzó. La firma también puede ser una afirmación de que el firmante está garantizando la calidad e integridad del software en ese compromiso.

+1

'git push --follow-tags' es otro comando que trata a ambos de manera diferente: http://stackoverflow.com/a/26438076/895245 –

9

Firmar una etiqueta es una manera fácil de afirmar la autenticidad de un lanzamiento.

Esto es particularmente útil en un DVCS porque cualquier persona puede clonar el repositorio y modificar el historial (por ejemplo, a través de git-filter-branch). Si se firma una etiqueta, la firma no sobrevivirá a una operación de git-filter-branch, por lo que si tiene una política de que cada versión está etiquetada y firmada por un committer, es posible detectar una etiqueta de lanzamiento falsa en el repositorio.

Si no fuera por la firma, tampoco vería mucho sentido en las etiquetas anotadas.

+1

En realidad, para esto podría ser útil tener una firma que solo firme el árbol comprometido, no toda su historia (no me importa si alguien manipuló el historial, solo quiero asegurarme de tener el código correcto). –

49

Mi, vista ligeramente diferente personal sobre ese tema:

  • etiquetas anotadas son esas etiquetas destinadas a ser publicadas por otros desarrolladores, muy probablemente nuevas versiones (que también debe ser firmado). No solo para ver quién etiquetó y cuándo fue etiquetado, sino también por qué (generalmente un registro de cambios).
  • Ligero son más apropiados para uso privado, eso significa etiquetar compromisos especiales para poder encontrarlos de nuevo. Puede ser para revisarlos, revisarlos para probar algo o lo que sea.
+0

Esto también se menciona en man git-tag: "Las etiquetas anotadas están pensadas para ser lanzadas, mientras que las ligeras están pensadas para etiquetas de objeto privadas o temporales.": Https://stackoverflow.com/a/35059291/895245 –

1

En mi oficina colocaremos la dirección de la página web de la versión en el cuerpo de la etiqueta. La página web de lanzamiento detalla todas las nuevas características y correcciones desde la última versión. La gerencia no buscará en el repositorio git para descubrir qué cambios sucedieron, y es bueno tener una lista concisa de lo que contiene esa publicación.

5

Utilice etiquetas anotadas para publicar comunicados de forma remota y sin anotación local (mentioned by Koraktor).

Justificación:

man git-tag dice:

etiquetas anotadas están destinados para su liberación mientras que las etiquetas ligeros son para etiquetas de objetos privados o temporales.

Y ciertos comportamientos no diferencian entre ellos de manera que esta recomendación es útil por ejemplo .:

  • etiquetas anotadas pueden contener un mensaje, creador y fecha diferente que el comprometen que apuntan. Entonces podría usarlos para describir un lanzamiento sin hacer un commit de lanzamiento.Las etiquetas livianas no tienen esa información adicional. (mentioned by Jefromi)
  • git push --follow-tags hará Etiquetas única empuje anotados
  • git describe sin opciones de línea de comandos etiquetas sólo ve anotados (mentioned by Novelocrat)

Ver también:

5

He encontrado un buen uso para las etiquetas livianas: crear un lanzamiento en GitHub en retrospectiva.

Lanzamos nuestro software y tuvimos los compromisos necesarios, simplemente no nos molestamos en mantener la sección 'Liberar' en el GitHub. Y cuando le prestamos un poco de atención, nos damos cuenta de que también queremos agregar algunas versiones anteriores, con las fechas correctas de versiones anteriores para ellas.

Si solo creáramos una etiqueta anotada en una confirmación anterior, GitHub tomaría la fecha para el lanzamiento del objeto de etiqueta. Por el contrario, cuando creamos una etiqueta ligera para este compromiso antiguo, el lanzamiento comenzó a mostrar la fecha correcta (anterior). Source @ GitHub help, 'About releases'

Parece también es posible especificar la fecha deseada para cometer una anotada, pero no se ve tan simple para mí: https://www.kernel.org/pub/software/scm/git/docs/git-tag.html#_on_backdating_tags

+0

Aunque hoy en día yo ' descubrí que GitHub dejó de respetar las fechas de las etiquetas para mí (tanto para etiquetas livianas como anotadas). Simplemente ignora la fecha de publicación del lanzamiento y en su lugar recuerda la fecha y hora de cuando presioné el botón "Publicar" para el lanzamiento. – evilkos

Cuestiones relacionadas