tag remove practices crear commits best git version-control cvs keyword-substitution

remove - git tag best practices



Pasar de CVS a git: $ Id: $ equivalent? (14)

Leí un montón de preguntas sobre las sencillas herramientas de control de código fuente y git me pareció una elección razonable. Lo tengo funcionando y funciona bien hasta ahora. Un aspecto que me gusta de CVS es el incremento automático de un número de versión.

Entiendo que esto tiene menos sentido en un repositorio distribuido, pero como desarrollador quiero / necesito algo como esto. Déjame explicar por qué:

Yo uso Emacs. Periódicamente reviso y busco nuevas versiones de los archivos fuente de lisp para paquetes de terceros. Digamos que tengo un archivo foo.el que según el encabezado es la versión 1.3; si busco la última versión y veo que es 1.143 o 2.6 o lo que sea, sé que estoy bastante rezagado. Si, en cambio, veo un par de hashes de 40 caracteres, no sabré cuál es posterior o tengo una idea de cuánto más tarde será. Absolutamente lo odiaría si tuviera que verificar manualmente ChangeLogs solo para tener una idea de lo anticuado que estoy.

Como desarrollador, quiero extender esta cortesía, como lo veo, a las personas que usan mi producción (y tal vez estoy bromeando de que alguien lo sea, pero dejemos eso de lado por un momento). No quiero tener que acordarme de incrementar el maldito número cada vez, o una marca de tiempo o algo así. Es un verdadero PITA, y lo sé por experiencia.

Entonces, ¿qué alternativas tengo? Si no puedo obtener un $ Id: $ equivalente, ¿cómo puedo proporcionar lo que estoy buscando? ¡Gracias por la ayuda!

EDITAR: Debo mencionar que mi expectativa es que el usuario final NO tendrá instalado git e incluso si lo hace, no tendrá un repositorio local (de hecho, espero no hacerlo disponible de esa manera). ¡Gracias por las respuestas hasta ahora!


Algo que se hace con los repositorios de git es usar el objeto de tag . Esto se puede usar para etiquetar una confirmación con cualquier tipo de cadena y se puede usar para marcar versiones. Puede ver esas etiquetas en un repositorio con el comando git tag , que devuelve todas las etiquetas.

Es fácil verificar una etiqueta. Por ejemplo, si hay una etiqueta v1.1 , puedes verificar esa etiqueta en una rama como esta:

git checkout -b v1.1

Como es un objeto de nivel superior, verá toda la historia de esa confirmación, así como también podrá ejecutar diffs, realizar cambios y fusionarse.

No solo eso, sino que la etiqueta persiste, incluso si la rama en la que se encontraba se ha eliminado sin fusionarse de nuevo en la línea principal.


Como he escrito before :

La generación automática de etiquetas Id que muestran un número de versión razonable es imposible de hacer con las herramientas DSCM, como Bazar, porque la línea de desarrollo de todos puede ser diferente a todas las demás. Entonces, alguien podría referirse a la versión "1.41" de un archivo, pero su versión "1.41" de ese archivo es diferente.

Básicamente, $ Id $ no tiene ningún sentido con Bazaar, Git y otras herramientas distribuidas de administración de código fuente.


Como usas emacs, puedes tener suerte :)

Me he encontrado con esta pregunta por coincidencia, y también por coincidencia, he venido por Lively unos días, un paquete de emacs que permite tener animadas piezas de ceceo de emacs en su documento. No lo he intentado para ser sincero, pero me vino a la mente al leer esto.


Esta no es una solicitud irracional del OP.

Mi caso de uso es:

  1. Utilizo git para mi propio código personal, por lo tanto, no tengo colaboración con otros.
  2. Guardo los scripts de Bash del sistema allí que podrían entrar en / usr / local / bin cuando estén listos.

Uso 3 máquinas separadas con el mismo repositorio git. Sería bueno saber qué "versión" del archivo tengo actualmente en / usr / local / bin sin tener que hacer un manual "diff -u

Para aquellos de ustedes que son negativos, recuerden que hay otros casos de uso por ahí. No todo el mundo usa git para el trabajo colaborativo con los archivos en el git repo siendo su ubicación "final".

De todos modos, la forma en que lo hice fue crear un archivo de atributos en el repositorio de esta manera:

cat .git/info/attributes # see man gitattributes *.sh ident *.pl ident *.cgi ident

Luego ponga $ Id $ en algún lugar del archivo (me gusta ponerlo después del shebang).

El compromiso. Tenga en cuenta que esto no hace automáticamente la explicación como esperaba. Tienes que volver a co-el archivo, por ej.

git commit foo.sh rm foo.sh git co foo.sh

Y luego verá la expansión, por ejemplo:

$ head foo.sh #!/bin/sh # $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

Alguna buena información en ¿Cómo habilito la cadena de identificación para repositorios Git?


Estoy de acuerdo con aquellos que piensan que el reemplazo de tokens pertenece a herramientas de construcción en lugar de herramientas de control de versiones.

Debería tener alguna herramienta de publicación automática para establecer los ID de versión en sus fuentes en el momento en que se está etiquetando el lanzamiento.


Las ID de RCS son agradables para proyectos de un solo archivo, pero para cualquier otra, $ Id $ no dice nada sobre el proyecto (a menos que haga check-ins ficticios forzados en un archivo de versión ficticia).

Todavía podría interesarle cómo obtener los equivalentes de $ Autor $, $ Fecha $, $ Revisión $, $ RCSfile $, etc. en un nivel por archivo o en el nivel de compromiso (Cómo ponerlos donde están algunas palabras clave es otra pregunta). No tengo una respuesta sobre estos, pero veo el requisito de actualizarlos, especialmente cuando los archivos (ahora en Git) se originaron en sistemas compatibles con RCS (CVS).

Dichas palabras clave pueden ser interesantes si las fuentes se distribuyen por separado desde cualquier repositorio de Git (eso es lo que también hago). Mi solución es la siguiente: cada proyecto tiene un directorio propio, y en la raíz del proyecto tengo un archivo de texto llamado .version cuyo contenido describe la versión actual (el nombre que se usará al exportar las fuentes).

Mientras trabajas para la próxima versión, un script extrae ese número .version , algún descriptor de versión de git (como git describe ) y un número de compilación monotónico en .build (más host y fecha) en un archivo fuente generado automáticamente que está vinculado a la versión final programa, para que pueda averiguar de qué fuente y cuándo se creó.

Desarrollo nuevas características en ramas separadas, y lo primero que hago es agregar n (para "siguiente") a la cadena .version (varias ramas que se originan en la misma raíz usarían el mismo número temporal de .version ). Antes del lanzamiento, decido qué ramas fusionar (espero que todas tengan la misma .version ). Antes de comprometer la fusión, actualizo .version al siguiente número (actualización principal o secundaria, dependiendo de las características fusionadas).


No estoy seguro de que esto vaya a estar en Git. Para citar a Linus :

"Toda la noción de sustitución de palabras clave es totalmente idiota. Es trivial hacer" fuera "del seguimiento de contenido real, si quieres tenerlo al hacer árboles de lanzamiento como bolas de alquitrán, etc."

Sin embargo, es bastante fácil verificar el registro: si está rastreando la rama estable de foo.el, puede ver qué nuevas confirmaciones hay en el registro de la sucursal estable que no están en su copia local. Si desea simular el número de versión interna de CVS, puede comparar la marca de tiempo de la última confirmación.

Editar: debe escribir o usar los scripts de otra persona para esto, por supuesto, no hacerlo manualmente.


Por ahora hay soporte para $ Id: $ en Git. Para habilitarlo para el archivo README , debe poner "README ident" en .gitattributes . Los comodines en los nombres de archivos son compatibles. Ver man gitattributes para más detalles.


Si lo entiendo correctamente, en esencia, desea saber cuántas confirmaciones se han producido en un archivo determinado desde la última actualización.

Primero obtenga los cambios en el origen remoto, pero no los fusione en su rama master :

% git fetch

Luego, obtenga un registro de los cambios que han ocurrido en un archivo determinado entre su rama master y el origin/master remoto.

% git log master..origin/master foo.el

Esto le proporciona los mensajes de registro de todas las confirmaciones que ocurrieron en el repositorio remoto desde la última vez que fusionó el origin/master en su master .

Si solo quieres contar los cambios, pásalo a wc . Diga, así:

% git rev-list master..origin/master foo.el | wc -l


Si solo quieres que la gente pueda hacerse una idea de lo desactualizados que están, Git puede informarles de ello de varias maneras bastante sencillas. Por ejemplo, comparan las fechas de la última confirmación en su tronco y su tronco. Pueden usar git cherry para ver cuántos commits han ocurrido en su trunk que no están presentes en el suyo.

Si eso es todo lo que quieres, buscaría la forma de proporcionarlo sin un número de versión.

Además, no me molestaría en extender la cortesía a nadie a menos que esté seguro de que la quiere. :)


Si tener $ palabras clave $ es esencial para usted, entonces ¿podría tratar de mirar Mercurial ? Tiene una extensión hgkeyword que implementa lo que desea. Mercurial es interesante como un DVCS de todos modos.


También vine de SCCS, RCS y CVS (% W%% G%% U%).

Tuve un desafío similar. Quería saber qué versión era una pieza de código en cualquier sistema que lo ejecutara. El sistema puede o no estar conectado a cualquier red. El sistema puede o no tener instalado git. El sistema puede tener o no tener el repositorio github instalado en él. Quería la misma solución para varios tipos de código (.sh, .go, .yml, .xml, etc.). Quería que cualquier persona sin conocimiento de Git o GitHub pudiera responder la pregunta; ¿Qué versión estás ejecutando?

Entonces, escribí lo que llamo envoltorio alrededor de algunos comandos de git. Lo uso para marcar un archivo con un número de versión y algo de información. Soluciona mi desafío. Puede ser de ayuda.

https://github.com/BradleyA/markit

git clone https://github.com/BradleyA/markit cd markit


Yo tuve el mismo problema. Se necesitaba tener una versión que fuera más simple que una cadena hash y disponible para las personas que usan la herramienta sin necesidad de conectarse al repositorio.

Lo hice con un gancho pre-commit de git y cambié mi script para poder actualizarlo automáticamente.

Baso la versión de la cantidad de confirmaciones realizadas. Esta es una ligera condición de carrera porque dos personas podrían comprometerse al mismo tiempo y ambas piensan que están comprometiendo el mismo número de versión, pero no tenemos muchos desarrolladores en este proyecto.

El mío está en ruby, pero no es un código terriblemente complejo. El script de ruby ​​tiene:

MYVERSION = ''1.090'' ## Call script to do updateVersion from .git/hooks/pre-commit def updateVersion # We add 1 because the next commit is probably one more - though this is a race commits = %x[git log #{$0} | grep ''^commit '' | wc -l].to_i + 1 vers = "1.%0.3d" % commits t = File.read($0) t.gsub!(/^MYVERSION = ''(.*)''$/, "MYVERSION = ''#{vers}''") bak = $0+''.bak'' File.open(bak,''w'') { |f| f.puts t } perm = File.stat($0).mode & 0xfff File.rename(bak,$0) File.chmod(perm,$0) exit end

Y luego tengo una opción de línea de comandos (-updateVersion) que llama a updateVersion para la herramienta.

Finalmente, voy al git head y creo un script ejecutable en .git / hooks / pre-commit.

El script simplemente cambia al encabezado del directorio de git y llama a mi script con -updateVersion

Cada vez que ingreso, la variable MYVERSION se actualiza según el número de confirmaciones.


El SHA es solo una representación de una versión (aunque canónica). El comando git describe ofrece otros, y lo hace bastante bien.

Por ejemplo, cuando ejecuto git describe en mi rama principal de mi fuente de cliente memcached java , obtengo esto:

2.2-16-gc0cd61a

Eso dice dos cosas importantes:

  1. Ha habido exactamente 16 commits en este árbol desde 2.2
  2. El árbol fuente exacto se puede mostrar en el clon de otra persona.

Digamos, por ejemplo, que empaquetó un archivo de version con la fuente (o incluso reescribió todo el contenido para su distribución) para mostrar ese número. Digamos que la versión empaquetada era 2.2-12-g6c4ae7a (no es una versión, sino una versión válida).

Ahora puede ver exactamente qué tan atrás está usted (4 commits), y puede ver exactamente qué 4 commits:

# The RHS of the .. can be origin/master or empty, or whatever you want. % git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a c0cd61a Dustin Sallings More tries to get a timeout. 8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui fb326d5 Dustin Sallings Added a test for bug 35. fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.