Git y dates de compromiso incrementales / número / algo

Estoy tratando de configurar un server de compilation usando tareas NAnt. Tengo algunos repositorys Git que quiero comstackr, pero tengo un problema con el control de versiones de los resultados.

¿Cómo funciona la versión de una biblioteca (dll) para que cada versión use un número para cada versión? Sé que Git no tiene Número de Revisión como SVN, sino más bien un Hash de algún tipo. Pensé en usar la date de compromiso. Solo buildé el maestro en el server central para que todos los commits aumenten (la date de fusión).

Si pudiera get la representación entera de la date, podría usar esto (YYMMDD).

Ahora usaré NAnt para hacer todas las cosas geniales :), ¿proporciona Git una forma de get la date del último compromiso?

usted quiere

git log -1 --pretty=format:%cd HEAD 

la cabeza es opcional Se infiere si no se especifica.

Esto le da el time de confirmación de la última confirmación (es decir, HEAD) como una timestamp UNIX (segundos desde época, es decir, 00:00:00 UTC del 1 de enero de 1970), que debería ser más o less lo que desea:

 % git show -s --format='format:%ct' HEAD 1334298121 

A continuación, puede usar la date para convertirlo al formatting YYMMDD que mencionó, y también agregar otras cosas:

 % date -r `git show -s --format='format:%ct' HEAD` +"foobar-%C%y%m%d.zip" foobar-20120413.zip 

(Agregué el siglo en el frente con %C porque parece lo más sensato que puedes hacer, pero puedes omitir eso, por supuesto. El foobar y el .zip son solo un ejemplo de cómo generarías directamente un nombre de file).

También hay algunos otros formattings que puede elegir, vea git show --help para más detalles:

 % git show -s --format='format:%cd' HEAD Fri Apr 13 14:22:01 2012 +0800 % git show -s --format='format:%cD' HEAD Fri, 13 Apr 2012 14:22:01 +0800 % git show -s --format='format:%cr' HEAD 3 months ago % git show -s --format='format:%ct' HEAD 1334298121 % git show -s --format='format:%ci' HEAD 2012-04-13 14:22:01 +0800 

Sé que esto no es lo que pediste, sin embargo, si quieres usar numbers de versión, entonces git-describe es una opción.

Lo uso para proporcionar información de versión para mis bibliotecas y progtwigs. Como uso el formatting de versión XYZ , git-describe funciona perfectamente para mí. Tiene el beneficio adicional de proporcionarme también el ID de confirmación de la última confirmación así que siempre sé exactamente en qué punto del historial de fonts se compiló la biblioteca / progtwig.

Para usar git-describe, debe usar tags firmadas. Al crear una label, utilizo el formatting de vX.Y git-describe agregará el parche y confirmará la información usando el formatting vX.YZ-gC donde X es la versión principal, Y es la versión menor, Z es el nivel de parche y C es la ID de confirmación de git.

Por ejemplo, creo una confirmación:

 $ git tag -s v0.2 -m "Creating release 0.2" $ git tag v0.0 v0.1 v0.2 $ git describe --long --abbrev=7 0.2.0.gbb871fd 

Luego puedo derivar la versión con nivel de parche usando lo siguiente:

 GIT_DESCRIBE=`git describe --long --abbrev=7 |sed -e 's/-/./g' -e 's/^v//g'` GIT_MAJOR=`echo ${GIT_DESCRIBE} |cut -d. -f1` GIT_MINOR=`echo ${GIT_DESCRIBE} |cut -d. -f2` GIT_PATCH=`echo ${GIT_DESCRIBE} |cut -d. -f3` GIT_COMMIT=`echo ${GIT_DESCRIBE} |cut -d. -f4` echo "${GIT_DESCRIBE}" 0.2.53.g00e0e11 echo "${GIT_MAJOR}.${GIT_MINOR}.${GIT_PATCH}.${GIT_COMMIT}" 0.2.53.g00e0e11 

En el resultado anterior, ha habido 53 confirmaciones (parcheadas) desde que se creó la última label y 00e0e11 es la identificación de confirmación parcial de la confirmación más reciente en el historial de revisiones.

Una vez que tengo la información de la versión analizada, puedo crear un file de cabecera C para definir los numbers de versión para usar dentro del código fuente:

 cat << EOF > lib_version.h #undef MYLIB_VER_MAJOR #undef MYLIB_VER_MINOR #undef MYLIB_VER_PATCH #undef MYLIB_VER_COMMIT #undef MYLIB_VERSION #define MYLIB_VER_MAJOR ${GIT_MAJOR} #define MYLIB_VER_MINOR ${GIT_MINOR} #define MYLIB_VER_PATCH ${GIT_PATCH} #define MYLIB_VER_COMMIT "${GIT_COMMIT}" #define MYLIB_VERSION "${GIT_DESCRIBE}" EOF 

He usado técnicas similares a la anterior para generar información de versión en packages usando autoconf (y amigos) y el objective de compilation externo de Xcode (en realidad, así es como todas las aplicaciones de iOS están versionadas).

Aquí hay un ejemplo del mundo real (con código fuente) que implementa lo anterior: http://bindle.github.com/LdapKit/ Observe que la información de la versión aparece en la documentation y se actualiza cada vez que regenero los documentos.