2008-12-15 9 views
45

Necesito hacer algunos commits usando Git pero me gustaría que la marca de tiempo en git-log sea en el futuro.git commit - configurando marcas de tiempo en el futuro

¿Cómo puedo hacer un commit en git que hace que una marca de tiempo futura se registre en el git-log?

+0

¿Has intentado cambiar tu reloj? =) Creo que debería funcionar a nivel local, pero no estoy seguro de qué pasaría cuando los demás se fusionen. – Kieveli

+3

Las marcas de tiempo no son relevantes para las fusiones. – Dustin

Respuesta

67

Debe esperar un poco.

O usted puede hacer esto:

/tmp/x 604% env GIT_AUTHOR_DATE='Wed Dec 19 15:14:05 2029 -0800' git commit -m 'future!' 
[master]: created 6348548: "Future!" 
1 files changed, 1 insertions(+), 0 deletions(-) 

/tmp/x 605% git log 

Author: Dustin Sallings <[email protected]> 
Date: Wed Dec 19 15:14:05 2029 -0800 

    Future! 

Nota que hay tanto una fecha de autor y una fecha confirmador, así que asegúrese de establecer la correcta (o ambos).

+7

También funciona con el formato de fecha ISO 8601: "2029-12-19 15:14:05 -0800". Me gusta eso. – sunny256

+2

¿Cuál es la diferencia entre GIT_AUTHOR_DATE y GIT_COMMITTER_DATE? – Blago

+4

@Blago: En git, el autor (la persona que escribió el cambio) y el committer (persona que colocó el cambio en el repositorio) son rastreados por separado. Te permite hacer todo tipo de cosas geniales. – Dustin

-5

¿Puedo preguntar por qué quieres hacer esto?

Si no desea cambiar su reloj, le sugiero que cree una secuencia de comandos para realizar la confirmación y use el Programador de Windows (o el equivalente para su sistema operativo) para ejecutar el script en el momento que desee la confirmación ser.

+1

Buena idea. En sistemas como Unix, podrías usar el comando "at" (ver "man at" para usarlo). –

10

Si desea conservar un cambio de fecha real cuando se añade a un proyecto Git, puede hacerlo con

env GIT_AUTHOR_DATE="`ls -rt *.cpp|tail -1|xargs date -u -r`" git commit -m "Old sources retaining old change-dates of last changed 
file: `ls -rt *.cpp|tail -1`, actual commit date: `date`" 

Esto comprometerse con el cambio de la fecha del último cambio * .cpp- archivo, y un bonito mensaje explicativo de la fecha real de compromiso.

48

Puede modificar la confirmación, un ejemplo con el año 2037:

git commit --amend --date="Wed Feb 16 14:00 2037 +0100" 

He probado el año 2038 también, pero entonces tiene un valor nulo para la fecha.

+11

Cualquier cosa hasta el 19 de enero 3:14:07 2038 UTC debería funcionar. http://en.wikipedia.org/wiki/Year_2038_problem – Arrowmaster

+0

Modificar una confirmación solo cambia la fecha del committer. Git rastrea 2 fechas: fecha de confirmación y autor.La fecha del autor permanecerá como el original a través de la modificación o cualquier otro comando de git que edite confirmaciones (p. Ej .: rebase y cherry-pick). – Zombies

+0

@Zombies mal: 'git log' muestra' GIT_AUTHOR_DATE' de manera predeterminada, no 'GIT_COMMITTER_DATE'. Puede verificar con 'git log --pretty = fuller' que muestra ambos. Al modificar la confirmación con la opción '--date', se cambia la _author date_. Al modificarlo sin esta opción solo cambia la _ fecha de compromiso_, ya que vuelve a crear la confirmación. – Tim

2

Mediante la combinación de la respuesta de Hugo (1) con información que se encuentra aquí (2), y la agitación de alguna sed, tengo esto:

alias newest="find . -path ./.git -prune -o -type f -exec stat -c \"%y %n\" '{}' + | sort -r | head -1 | sed s#'.*\./'##" 
GIT_AUTHOR_DATE="$(newest | xargs date -u -r)" GIT_COMMITTER_DATE="$(newest | xargs date -u -r)" git commit -m "Old sources retaining old change-dates of last changed file: $(newest), actual commit date: $(date)" 

La principal diferencia es que esta versión hace una búsqueda recursiva, por lo obtienes el último archivo en cualquier lugar del árbol, aunque omite el directorio .git, intencionalmente.

Puede, por supuesto, querer soltar una de las variables de fecha aquí, y estoy usando una versión bastante reciente de Bash (4.2.37 (1)), por lo que la notación $() podría no funcionar para ti (simplemente reemplázalo con barras (`) en su lugar).

+0

su 'más nueva | xargs date -u -r' muere en espacios en el nombre del archivo. sed en el repositorio de FSF admite líneas terminadas en nulo y eso haría que toda la tubería fuera segura, pero hasta entonces yo diría usar -d \\ n cuando xarg'ing nombres de archivos. . . . 'encontrar. -name .git -prune -o -type d -o -print0 | xargs -0 ls -dt | sed q' es más corto – jthill