tortoise software control best svn git version-control

software - svn vs git



¿Tiene git algo como `svn propset svn: keywords` o pre/post-commit hooks? (5)

Al examinar la documentación de git, no puedo ver nada análogo a los enganches de commit de SVN o las características de "propset" que pueden, digamos, actualizar un número de versión o un aviso de copyright dentro de un archivo siempre que esté comprometido con el repositorio.

¿Se espera que los usuarios de git escriban scripts externos para este tipo de funcionalidad (lo que no parece fuera de lugar) o me he olvidado de algo obvio?

Editar : Para que quede claro, estoy más interesado, por ejemplo,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

donde una cadena como esta:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

se mantiene actualizado con la información relevante cada vez que se produce una confirmación.


Aunque es un Q & A antiguo. Pensé en tirar uno porque esto me ha estado molestando por mucho tiempo.

Estoy acostumbrado a enumerar los archivos en un directorio por orden de tiempo invertido (¿me parece gracioso, je?). La razón es que me gustaría ver qué archivos tengo (o alguien más) cambiado recientemente.

Git arruinará mis planes porque al cambiar una sucursal, el repositorio local sobrescribirá por completo los archivos rastreados de las copias (incrementales ... lo sé ...) que se encuentran en el repositorio local empaquetado.

De esta forma, todos los archivos que fueron desprotegidos llevarán la marca de tiempo de la salida y no reflejarán la última hora de modificación ... Qué tan molesto.

Entonces, he ideado un one-liner en bash que actualizará una propiedad $ Date: $ dentro de cualquier archivo CON LA HORA DE LA ÚLTIMA MODIFICACIÓN SEGÚN LO QUE TIENE EN EL SISTEMA DE ARCHIVOS, de modo que tendré un estado inmediato que me diga la última modificación sin tener que navegar en el git log , git show o cualquier otra herramienta que proporcione los tiempos de confirmación en el modo de culpa .

El siguiente procedimiento modificará la palabra clave $ Date: $ solo en los archivos rastreados que se comprometerán con el repositorio. Utiliza git diff --name-only que git diff --name-only archivos que fueron modificados, y nada más ....

Utilizo este one-liner manualmente antes de confirmar el código. Sin embargo, una cosa es que tengo que navegar hasta el directorio raíz del repositorio antes de aplicar esto.

Aquí está la variante del código para Linux (pegado como una línea múltiple para la legibilidad)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | / perl -pe ''s/[^[:ascii:]]//g;'' | while read l; do / set -- $l; f=$1; shift; d=$*; modif=`date -d "@$d"`; / perl -i.bak -pe ''s//$Date: [/w /d//:,.)(+-]*/$//$Date: ''"$modif"''/$/i'' $f; / git add $f; done

y OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do / set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; / perl -i.bak -pe ''s//$Date: [/w /d//:,.)(+-]*/$//$Date: ''"$modif"''/$/i'' $f; / git add $f; done


Citando de las preguntas frecuentes de Git :

¿Git tiene expansión de palabra clave?

No recomendado. La expansión de palabras clave causa todo tipo de problemas extraños y, de todos modos, no es realmente útil, especialmente en el contexto de un SCM. Fuera de Git puede realizar la expansión de palabras clave usando un script. El script de exportación del kernel de Linux hace esto para establecer la variable EXTRA_VERSION en el archivo Makefile.

Ver gitattributes (5) si realmente quieres hacer esto. Si su traducción no es reversible (por ejemplo, expansión de palabra clave SCCS), esto puede ser problemático.


Escribí una respuesta bastante completa a esto en otro lugar, con un código que muestra cómo hacerlo. Un resumen:

  1. Probablemente no quieras hacer esto. Usar git describe es una alternativa razonable.
  2. Si necesita hacer esto, $Id$ y $Format$ son bastante fáciles.
  3. Cualquier cosa más avanzada requerirá el uso de gitattributes y un filtro personalizado. Proporciono una implementación de ejemplo de $Date$ .

Las soluciones basadas en funciones de enlace generalmente no son útiles porque hacen que su copia de trabajo esté sucia.


Git tiene anzuelos precompromisos y postcompromisos, se encuentran dentro de cada directorio .git / hooks. Simplemente modifique los archivos y modifíquelos para que sean ejecutables.


Quizás la propiedad más común de SVN, ''svn: ignorar'' se hace a través del archivo .gitignore, en lugar de los metadatos. Me temo que no tengo nada más útil para los otros tipos de metadatos.