2011-02-23 25 views
6

EDITAR: Resumen: Git no permite fechas anteriores al 03/03/1973 09:46:40 (+ época 100000000s) dada en su "formato de fecha interno" (segundos desde la época). Esto es para permitir "20110224" como forma abreviada de "2011-02-24". - Esto no es ningún error: No realmente, pero tampoco está documentado. - Solución temporal: No confíe en la fecha interna de git cuando no puede. - Gracias a : Hobbs

Hola a todos,

tengo algunos problemas con git filter-branch que he seguido la pista a git commit-árbol. Considere este script:

#!/bin/bash 
# please run these commands in an empty directory 
# (should not destroy an existing repo, though. I think it would only 
# a few dangling objects) 

set -e -o pipefail 

git init 
tree=$(git write-tree) 
commit=$(echo "my first commit -- the tree is empty" | 
    env GIT_AUTHOR_DATE="0 +0000" git commit-tree $tree) 

echo "This is commit $commit:" 
git cat-file commit $commit 

Tenga en cuenta que los env GIT_AUTHOR_DATE="0 +0000" determina la fecha utilizando el "formato interno Git" - ver página del manual de git-commit-árbol para los detalles - a 1970-01-01.

Pero la salida de este script (cometer el crudo) es

tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 
author Jane Doe <jane> 1298477214 +0100 
committer Jane Doe <jane> 1298477214 +0100 

my first commit -- the tree is empty 

Ahora qué está haciendo caso omiso de git $ GIT_AUTHOR_DATE? Si eso es significativo, mi git --version da git version 1.7.1.

Respuesta

19

encontrado en el código git fecha analizador:

/* 
* Seconds since 1970? We trigger on that for any numbers with 
* more than 8 digits. This is because we don't want to rule out 
* numbers like 20070606 as a YYYYMMDD date. 
*/ 
if (num >= 100000000 && nodate(tm)) { 

Dado que el código rechaza explícitamente un número pequeño como posibles fechas Unix, y la cadena no analiza como cualquier otro formato de fecha, GIT_AUTHOR_DATE es tratado como no válido e ignorado por completo (y aparentemente, en silencio).

Su método debería funcionar bien sin embargo, siempre y cuando usted se pega a sintetizar se compromete a que tuvieron lugar después de 1973. De lo contrario, utilice uno de los otros formatos de fecha :)

+0

Excelente captura! – Arrowmaster

+0

Guau, ojalá pudiera votar esto varias veces. ¿Qué demonios te hizo pensar en verificar esto? –

+4

@Adrian No vi nada en los documentos, y ya había revisado la fuente de git ... así que comencé a grepping. A veces RTFS llega al corazón del problema más rápido que cualquier otra cosa :) – hobbs

Cuestiones relacionadas