2009-11-24 9 views

Respuesta

15

Puede hacer esto agregando un patrón para los archivos que desea esta funcionalidad seguido de ident en el archivo .gitattributes. Esto reemplazará $ Id $ con $ Id: < 40-digit SHA> $ en la salida del archivo. Sin embargo, tenga en cuenta que no le dará un número de revisión del archivo como en CVS/SVN.

Ejemplo:

$ echo '*.txt ident' >> .gitattributes 
$ echo '$Id$' > test.txt 
$ git commit -a -m "test" 

$ rm test.txt 
$ git checkout -- test.txt 
$ cat test.txt 

Enlace a gitattributes(5) Manual Page

+3

Acabo de jugar con esto y, por lo que puedo decir, esto solo da un SHA para un archivo específico, no un $ Id $ para todo el repositorio. – Aaron

+0

¿Qué pasa con '% Format%'? –

37

Resumen: Forma recomendada de incrustar información de la versión del producto es utilizar sistema de construcción para eso; ver a continuación para obtener detalles y enfoques alternativos.


En Git (y creo que por lo general también en otros sistemas de control de versiones con commits atómicas) no hay tal cosa como versión de un solo archivo .

Git hace de soporte de expansión en la demanda de $Id:$ palabra clave, pero:

  1. Se realiza bajo petición solamente. Debe especificar (tal vez usando un patrón globbing) que un archivo (o un conjunto de archivos) tiene un conjunto identattribute (en el archivo '.gitattributes' en árbol, o en '.git/info/attributes' para la configuración del repositorio local) .
  2. Se expande a SHA-1 del archivo (o para ser más exactos a $Id:<sha-1 of blob>$). El motivo de esta elección es que Git no toca archivos que no han cambiado durante el cambio de rama o el rebobinado; si '$ Id: $' se expandió a la información de revisión, requerirá actualizar cada archivo controlado por versión, p. al cambiar de ramas.

Git apoya bastante un amplio conjunto de $Format:...$ marcadores de posición que se expande para cometer información (por ejemplo $Format:%H$ reemplazado por un hash cometer) pero:

  1. de expansión se realiza solamente cuando se ejecuta git archive, en su salida archivo.
  2. Se hace bajo pedido, controlado a través de export-subst atributo.

El método recomendado para la incorporación de información de la versión es hacerlo a través del sistema de acumulación (en una etapa de construcción); ver, por ejemplo, el script Git Makefile y GIT-VERSION-GEN utilizado por Makefile en la interfaz web de git para el repositorio de git.git.

Sin embargo, puede (ab) utilizar el controlador de filtro clean/smend (mediante el atributo filter) para obtener la expansión de palabra clave CVS, expandir las palabras clave al finalizar y limpiarlas al ingresar los contenidos en el repositorio.

+0

controlador de filtro sería realmente genial si realmente tuviera alguna potencia. Por lo que parece, solo parece obtener un nombre de archivo como parámetro, es decir, menos que el filtro ident, obteniendo BLOB SHA1 como parámetro. Si pudiéramos pasar '$ Format: ... $' para filtrar la línea de comandos del controlador, eso lo haría todo mucho mejor. Y eso debería comenzar con el conjunto de caracteres de archivos de texto ... –

+0

No existe una versión de un solo archivo, pero existe el estado de todos los archivos en un momento dado. ese estado está representado por un hash. –

+0

@GeorgeStocker: sí, el estado de todos los archivos puede representarse mediante el hash SHA-1 del objeto de árbol superior del proyecto, pero es algo diferente del hash SHA-1 del objeto blob, es decir, del contenido del archivo. –

2

El identificador de Git no hace lo que $ Id $ hace en otros sistemas de versiones. Como un kludge, use RCS junto con git: RCS para revisiones de archivos individuales y git para marcar el proyecto como un todo. Como dije, esto es un desafío, pero tiene sentido (a veces para algunas cosas).

Cuestiones relacionadas