¿Un enfoque diferente para las cadenas de estilo de identidad en Git?

Estoy planificando la transición de mi compañía de CVS a Git, y ciertos ingenieros desean seguir utilizando cadenas de palabras key de CVS como $Id: $ . He leído todo sobre la implementación de esto con la configuration de identificación .gitattributes , y entiendo por qué es indeseable, aunque tal vez sea posible para treees fuente más pequeños. (Nuestra fuente es enorme, así que creo que sería imposible).

Nuestros ingenieros no se preocupan especialmente por tener el hash SHA1 en el file. Solo quieren saber:

  1. la date de la última modificación
  2. el nombre del committer
  3. posiblemente el post de compromiso

Les resulta extremadamente útil ver esta información en los encabezados de los files cuando navegan por el código, y no puedo discutir con eso.

Lo que quiero saber es:

¿Hay alguna manera de estampar en la información todos los files por etapas en el momento antes de que se comprometan git? En otras palabras, ¿para ejecutar un command perl – que reemplaza $Id: $ con un bloque de información deseada – en las copys de trabajo de los files que se están comprometiendo?

Esto no requeriría acciones de .gitattributes en absoluto. Git solo necesitaría saber cómo fusionar dos bloques de información de este tipo, idealmente eligiendo el más reciente. La información sellada sería solo un cambio de file más en la versión recién creada.

Miré haciendo esto en el gancho precompromiso, pero parece ser diferente, no para editar files, solo para verificarlos. ¿Estoy en lo cierto acerca de eso?

¿Y nadie ha intentado este enfoque? Me parece más simple que tratar de filtrar todos los files fuente cada vez que git cambia las versiones, que suena como .gitattributes hace .gitattributes .

Muchas gracias por cualquier consejo / advertencia / pointers.

RCS (y por lo tanto CVS) hace la expansión de $Id:$ y tal al momento de pagar , esos no están en los files guardados. Y realmente no pueden ser, alguien podría cambiar el nombre de la versión 1.8.2-rc10 a la simple 1.8.2 . Si alguien quiere saber de dónde viene el file , git log file responde muy bien, con más detalles de los que RCS podría dar. Y es un command local, no hay viaje al server CVS (y, por lo tanto, está disponible en todas partes donde git es e instantáneo).

La sección de expansión de palabras key de la documentation de git explica cómo hacer una expansión limpia de palabras key.

Un script de ruby ​​para expandir lo que quieres sería algo como esto (no probado)

 #! /usr/bin/env ruby data = STDIN.read last_info = `git log --pretty=format:"%ad %cn %s" -1` puts data.gsub('$Last$', '$Last: ' + last_info.to_s + '$') 

filter de configuration

 $ git config filter.last_expander.smudge expand_last_info $ git config filter.last_expander.clean 'perl -pe "s/\\\$Last[^\\\$]*\\\$/\\\$Last\\\$/"' 

setup .gitattributes

 echo '*.txt filter=last_expander' >> .gitattributes 

Nota: (al igual que dice vonbrand) lo que esto le proporciona, y lo que probablemente desee, es la expansión del campo al finalizar la compra y la eliminación de los campos en la confirmación. Pero el efecto es que sus ingenieros podrán leer el campo en los files desprotegidos en su directory de trabajo. ¿No es eso lo que quieren? Y esto no estropeará el contenido realmente versionado con ningún metadato networkingundante.

Así es como resuelves esto:

  1. Agregue el siguiente enlace precompromiso:

     #!/bin/sh git diff --cached --name-only -z --diff-filter=ACM | xargs -r0 .filters/keywords -- git diff --cached --name-only -z --diff-filter=ACM | xargs -r0 git add -u -v -- 
  2. Agregue el siguiente enlace commit-msg:

     #!/bin/sh awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit # NOTREACHED unless commit was aborted git diff --cached --name-only -z --diff-filter=ACM | xargs -r0 .filters/keywords -d -- git diff --cached --name-only -z --diff-filter=ACM | xargs -r0 git add -u -v -- 
  3. Descargue ".filters / fraubsd-keywords" pero cambie el nombre del file a "palabras key":

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. Edite "palabras key", cambiando en la sección CONFIGURACIÓN en la parte superior:

    • FrauBSD al encabezado
    • _FrauBSD a _Header

Después de lo cual, cada vez que hagas un git commit el text $Header$ y / o $Header: ... $ se traducirán a $Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

NOTA: Es posible que deba modificar una pequeña sección del script "keywords" para operar en más o less types de files. En el momento de escribir esto, solo opera en files que son "text ASCII" o "scripts de shell".