2011-02-23 4 views
6

편집 : 요약 : 힘내 허용하지 않습니다 날짜의 "내부 날짜 형식"(신기원 이후의 초)에 주어진 1973년 3월 3일 9시 46분 40초 (신기원 + 100000000s) 전. 이것은 "20110224"를 "2011-02-24"의 약식으로 허용하는 것입니다. - 이것은 버그가 아닙니다 : 실제로는 아니지만 문서화되지 않았습니다. - 해결 방법 : 할 수없는 경우 자식 내부 날짜에 의존하지 마십시오. --감사합니다 : 홉스

안녕 모두,

내가 자식 커밋 나무 아래로 추적 한 자식 필터 지점 몇 가지 문제가 있습니다. - 자세한 내용은 자식 커밋 트리의 맨 페이지를 참조 - 1970-01-01에 env GIT_AUTHOR_DATE="0 +0000" 설정은 "망할 놈의 내부 형식"을 사용하여 날짜가

#!/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 

참고 :이 스크립트를 고려하십시오.

그러나이 스크립트의 출력 (원시 커밋은) 왜 자식이 $ GIT_AUTHOR_DATE을 무시 이제

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

my first commit -- the tree is empty 

입니까? 이것이 중요한 경우 내 git --versiongit version 1.7.1이됩니다. 망할 놈의 날짜 파서 코드에서 발견

답변

19

:

/* 
* 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)) { 

그 코드가 명시 적으로 가능한 유닉스 날짜 작은 숫자를 거부하고, 문자열이 다른 날짜 형식으로 구문 분석하지 않기 때문에

, GIT_AUTHOR_DATE은 무효 처리됩니다 그리고 완전히 무시 당했다 (그리고 명백하게, 조용하게).

귀하의 방법은 그렇지 않으면, 다른 날짜 형식 중 하나 :)

+0

우수한 캐치를 사용하여 1973 년 이후에 일어났다 커밋 합성에만큼 당신이 스틱으로하지만 잘 작동합니다! – Arrowmaster

+0

와우, 나는 이것을 여러 번 upvote 할 수 있었으면 좋겠다. 이 지구를 확인해 보니 무슨 생각이 들었습니까? –

+4

@Adrian 문서에서 아무 것도 보지 못했고 이미 git 소스를 체크 아웃했습니다 ... 그래서 grepping을 시작했습니다. 때로는 RTFS가 무엇보다도 빠른 속도로 문제의 핵심에 도달합니다. – hobbs