git checkout – ¿cómo puedo mantener las marcas de time cuando cambio de sucursales?

A menudo cambio de una twig a otra. Tengo un script que empuja el contenido del checkout a un entorno 'en ejecución' donde puedo ver el código ejecutar y probarlo (es una aplicación web). Esta secuencia de commands push utiliza rsync en su núcleo y usa marcas de time para detectar qué files deberían transferirse realmente. Debido a que git-checkout parece establecer las marcas de time en los files a la hora actual, rsync informa que todos los files se están subiendo, solo porque las marcas de time se actualizarán.

¿Cómo puedo hacer que git-checkout conserve marcas de time al cambiar de una twig a otra para que rsync solo reporte cambios de contenido?

No quiero usar el argumento de sum de comprobación de rsync, ya que es muy lento.

La razón por la que git checkout actualiza las marcas de time es porque casi todos los sistemas de compilation para el código fuente dependen de las marcas de time para determinar si los objectives deben rebuildse. Si git checkout no actualizó las marcas de time en los files cuando se actualizan, estos sistemas de compilation no realizarían correctamente una compilation incremental. De hecho, git checkout solo debe actualizar las marcas de time en los files que han cambiado.

rsync debería ser eficiente en la actualización de marcas de time y no transferir datos si solo han cambiado los metadatos. Puede verificar esto con la "aceleración". También puede solicitar versiones recientes de rsync para detallar los cambios con el -i . Puede decirle a rsync no use marcas de time (y solo use sums de verificación) al omitir -a o -t pero eso no es recomendado por la página de rsync(1) man rsync(1) .

La situación (con respecto a git checkout y timestamps) debería ser mejor con Git 2.2.2+ (enero de 2015).

La timestamp no debería moverse más para los files que ya están actualizados al hacer un git checkout .

Ver commit c5326bd por Jeff King ( peff ) :

pago $ tree: no tirar las inputs de índice sin cambios

Cuando " git checkout $tree ", nosotros:

  • trazar paths desde $tree en el índice, y luego
  • verifica las inputs resultantes en el tree de trabajo.

Sin embargo, nuestro método para el primer paso es bastante severo; anula toda la input de índice existente, incluso si el contenido es el mismo.
Esto significa que perdemos nuestra información de statistics, lo que lleva a checkout_entry a volver a escribir el file completo con contenido idéntico.

En cambio, veamos si ya tenemos la input idéntica en el índice, en cuyo caso la dejamos en su lugar. Eso permite que checkout_entry haga lo correcto.
Nuestras testings cubren dos casos interesantes:

  1. Nos aseguramos de que un file que no tiene cambios no se reescriba.
  2. Nos aseguramos de que actualicemos un file sin cambios en el índice (frente a $tree ), pero tiene cambios en el tree de trabajo.
    Mantenemos la input de índice anterior, y checkout_entry puede darse count de que nuestra información estadística no está actualizada.

Parece que la única razón por la que lo haces de esta manera es que en un entorno DVCS, puedes usar un viejo file de timestamp para actualizar un nuevo file de timestamp y causar un problema de compilation. No creo que esto sea bueno, porque rara vez usamos un viejo file de timestamp para actualizar un nuevo file de timestamp.

  1. Creo que esto se puede manejar de una manera inteligente: cuando actualice el file A con el file B,

    file_timestamp = (timestamp (B)> timestamp (A))? timestamp (B): timestamp (CORRIENTE);

  2. o, esto podría diseñarse como una opción configurable.