ver tag remota rama oneline modificados log example crear cambiar archivos git

remota - git push tag



¿Cómo incluirías la identificación del commit actual en los archivos de un proyecto Git? (2)

Tengo una aplicación JavaScript + HTML estática de código abierto que se implementa en tres lugares diferentes en este momento, uno en mi máquina local, uno en un servidor interno y otro en un servidor externo estable.

Me gustaría poder decir inmediatamente qué versión se implementa en qué lugar, y me gustaría que los reporteros de errores tengan fácil acceso a la versión en la que informan el error.

Lo ideal sería que, como parte del proceso de confirmación, un archivo se escriba con el hash de la confirmación. Por supuesto, por lo que sé de Git, esto es imposible, ya que incluir el hash calculado como parte de un archivo en una confirmación cambiaría el hash calculado de esa confirmación.

Por otro lado, podría incorporar construir esto como parte de un proceso de construcción. Aunque actualmente no tengo un proceso de compilación, me gustaría evitar agregar un paso si es posible.

¿Cuál es la forma más limpia de hacer esto?


Agréguelo a su sistema de implementación automatizada.

Si su implementación no está automatizada, automatícela y agréguela allí. Luego has eliminado un paso.

Haz que sea más útil "esto se implementó en la fecha x en el momento desde el repositorio z". El hash de la confirmación no significa mucho para los no desarrolladores.


Hay algunas sutilezas en esto debido a la naturaleza de Git. La forma en que lo hice es copiando lo que hacen los propios desarrolladores de Git. En primer lugar, querrá usar etiquetas anotadas, lo que probablemente sea una buena idea de todos modos. Para revisar, puedes crear una nueva etiqueta como esta:

$ git tag -a -m "Version 0.2" v0.2 HEAD

Luego (como se sugiere en la publicación de Otto) puede usar git describe para una cadena de "versión" útil que incluirá el número de confirmaciones desde la etiqueta y los dígitos iniciales del sha1 de la confirmación actual. Aquí hay un ejemplo de uno de mis proyectos:

$ git describe v1.0-3-gee47184

Es decir, esta copia es 3 confirmaciones antes de la etiqueta "v1.0" y la confirmación sha1 comienza con ee47184 (no estoy seguro de por qué incluyen esa "g" inicial).

Los desarrolladores de Git van un paso más allá y también incluyen un bit adicional si la copia de trabajo se modifica (no confirmada). Esto requiere unos pocos pasos más, por lo que todo está envuelto en un script que denominan VERSION-GEN . Cuando se ejecuta, imprime la cadena de versión en salida estándar y también crea un archivo VERSION-FILE (la secuencia de comandos tiene cuidado de no volver a tocar ese archivo si la versión no ha cambiado, por lo que es amigable con la herramienta de construcción). Luego, puede incluir ese archivo VERSION-FILE en su código fuente, archivos de ayuda, etc.

Usando mi script VERSION-GEN ejemplo (abajo), mi cadena de versión para el ejemplo anterior es:

$ VERSION-GEN version: 1.0-3-gee47

Si modifico alguno de los archivos rastreados se ve así:

$ VERSION-GEN version: 1.0-3-gee47-mod

Aquí está mi versión ligeramente modificada de VERSION-GEN . Tenga en cuenta que espera que las etiquetas que marcan versiones tengan la forma v [0-9] * (p. Ej., V1.0 o v0.2 o v12.3.4 o v12.2-4feb2009, etc.)

#!/bin/sh # Tag revisions like this: # $ git tag -a -m "Version 0.2" v0.2 HEAD VF=VERSION-FILE DEFAULT_VERSION=UKNOWN LF='' '' # First see if there is a version file (included in release tarballs), # then try git-describe, then default. if test -d .git -o -f .git && VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && case "$VN" in *$LF*) (exit 1) ;; v[0-9]*) git update-index -q --refresh test -z "$(git diff-index --name-only HEAD --)" || VN="$VN-mod" ;; esac then continue #VN=$(echo "$VN" | sed -e ''s/-/./g''); else VN="$DEFAULT_VERSION" fi VN=$(expr "$VN" : v*''/(.*/)'') # Show the version to the user via stderr echo >&2 "version: $VN" # Parse the existing VERSION-FILE if test -r $VF then VC=$(sed -e ''s/^version: //'' <$VF) else VC=unset fi # If version has changed, update VERSION-FILE test "$VN" = "$VC" || { echo "version: $VN" >$VF echo >&2 "($VF updated)" }