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)"
}