Hi,
I'm following an upstream repo on github. Today morning I saw a new
commit there, but a `git pull` in my clone did not fetch it and
instead said "Already up-to-date.". On closer inspection, github
reports commit time as 2152-06-19. The same project has some other
commits with commit time in the future that were fetched. My guess is
that happened when those commits got a child with commit date in the
past.
Is there any way to force git pulling that request? (Perhaps I should
try to tell git that it's really 2152?)
For the record: the faulty commit is
https://github.com/seandepagnier/weather_routing_pi/commit/23c07cc5d2be7ce68349f4b3719b6fa6fe90e0bf
Hmm. On closer inspection that commit 23c07cc that github shows with
date 2152-06-19 is already in my local branch. I got confused because
locally it is shown with a different date: `git log -1 --format='%ci'
23c07cc` shows "2106-02-07 06:28:56 -40643156" which is invalid.
My system is running Debian unstable 64bit. Is git using the time
rendering methods from the C library (glibc 2.22-12)?
On Mon, Jun 20, 2016 at 11:46 AM, Stefan Beller [off-list ref] wrote:
On Mon, Jun 20, 2016 at 11:41 AM, Norbert Kiesel [off-list ref] wrote:
quoted
Hi,
I'm following an upstream repo on github. Today morning I saw a new
commit there, but a `git pull` in my clone did not fetch it and
instead said "Already up-to-date.". On closer inspection, github
reports commit time as 2152-06-19. The same project has some other
commits with commit time in the future that were fetched. My guess is
that happened when those commits got a child with commit date in the
past.
git-pull doesn't care about the commit/author date/time at all.
All it takes into consideration
is the graph structure of the commits on the local and the remote branch,
i.e. Are there any commits on the remote branch that are not part of the local
branch history?
quoted
Is there any way to force git pulling that request? (Perhaps I should
try to tell git that it's really 2152?)
You need to see if that commit is part of the history of the
remote branch you pulled.
From: Stefan Beller <hidden> Date: 2016-06-20 19:14:53
On Mon, Jun 20, 2016 at 11:41 AM, Norbert Kiesel [off-list ref] wrote:
Hi,
I'm following an upstream repo on github. Today morning I saw a new
commit there, but a `git pull` in my clone did not fetch it and
instead said "Already up-to-date.". On closer inspection, github
reports commit time as 2152-06-19. The same project has some other
commits with commit time in the future that were fetched. My guess is
that happened when those commits got a child with commit date in the
past.
git-pull doesn't care about the commit/author date/time at all.
All it takes into consideration
is the graph structure of the commits on the local and the remote branch,
i.e. Are there any commits on the remote branch that are not part of the local
branch history?
Is there any way to force git pulling that request? (Perhaps I should
try to tell git that it's really 2152?)
You need to see if that commit is part of the history of the
remote branch you pulled.
From: Jeff King <hidden> Date: 2016-06-20 19:40:08
On Mon, Jun 20, 2016 at 12:05:07PM -0700, Norbert Kiesel wrote:
Hmm. On closer inspection that commit 23c07cc that github shows with
date 2152-06-19 is already in my local branch. I got confused because
locally it is shown with a different date: `git log -1 --format='%ci'
23c07cc` shows "2106-02-07 06:28:56 -40643156" which is invalid.
My system is running Debian unstable 64bit. Is git using the time
rendering methods from the C library (glibc 2.22-12)?
No, git's time code is (mostly) internal routines. Can you show us the
output of:
git cat-file commit 23c07cc | egrep '^author|committer'
Note also that some interfaces (like "git log", and GitHub) will show
the author date by default, which might be different than the committer
date. The "-40643156" timezone definitely looks suspicious, though. I'm
curious if it is bad handling in the time code, or if the commit has
corrupt ident lines.
-Peff
author Sean D'Epagnier [off-list ref] 5758122296 -40643156
committer Sean D'Epagnier [off-list ref] 5758122296 -40643156
date --date='@5758122296' returns "Mon Jun 19 15:24:56 PDT 2152" which
is what is shown by github.
From: Jeff King <hidden> Date: 2016-06-20 19:47:08
On Mon, Jun 20, 2016 at 03:39:28PM -0400, Jeff King wrote:
On Mon, Jun 20, 2016 at 12:05:07PM -0700, Norbert Kiesel wrote:
quoted
Hmm. On closer inspection that commit 23c07cc that github shows with
date 2152-06-19 is already in my local branch. I got confused because
locally it is shown with a different date: `git log -1 --format='%ci'
23c07cc` shows "2106-02-07 06:28:56 -40643156" which is invalid.
My system is running Debian unstable 64bit. Is git using the time
rendering methods from the C library (glibc 2.22-12)?
No, git's time code is (mostly) internal routines. Can you show us the
output of:
git cat-file commit 23c07cc | egrep '^author|committer'
Note also that some interfaces (like "git log", and GitHub) will show
the author date by default, which might be different than the committer
date. The "-40643156" timezone definitely looks suspicious, though. I'm
curious if it is bad handling in the time code, or if the commit has
corrupt ident lines.
Actually, I just noticed in your earlier message a link to the public
GitHub repository.
So to answer my own questions:
$ git cat-file commit 23c07cc | egrep '^author|committer'
author Sean D'Epagnier [off-list ref] 5758122296 -40643156
committer Sean D'Epagnier [off-list ref] 5758122296 -40643156
Yes, the timezone really is that ridiculous value. No, the author and
committer aren't different. According to GNU date, the correct timestamp
is actually in 2152. Offhand, I'd guess that the timestamp exceeding
2^32 is getting converted somewhere inside git to a bogus value, and
that's how we end up with 2106.
-Peff
From: Eric Deplagne <hidden> Date: 2016-06-20 19:50:54
On Mon, 20 Jun 2016 15:39:28 -0400, Jeff King wrote:
On Mon, Jun 20, 2016 at 12:05:07PM -0700, Norbert Kiesel wrote:
quoted
Hmm. On closer inspection that commit 23c07cc that github shows with
date 2152-06-19 is already in my local branch. I got confused because
locally it is shown with a different date: `git log -1 --format='%ci'
23c07cc` shows "2106-02-07 06:28:56 -40643156" which is invalid.
My system is running Debian unstable 64bit. Is git using the time
rendering methods from the C library (glibc 2.22-12)?
No, git's time code is (mostly) internal routines. Can you show us the
output of:
git cat-file commit 23c07cc | egrep '^author|committer'
Note also that some interfaces (like "git log", and GitHub) will show
the author date by default, which might be different than the committer
date. The "-40643156" timezone definitely looks suspicious, though. I'm
curious if it is bad handling in the time code, or if the commit has
corrupt ident lines.
-Peff
2106 is the year of unsigned 32-bit unix time bug, would there be any relation ?
--
Eric Deplagne
From: Jeff King <hidden> Date: 2016-06-20 20:01:18
On Mon, Jun 20, 2016 at 03:46:49PM -0400, Jeff King wrote:
So to answer my own questions:
$ git cat-file commit 23c07cc | egrep '^author|committer'
author Sean D'Epagnier [off-list ref] 5758122296 -40643156
committer Sean D'Epagnier [off-list ref] 5758122296 -40643156
Yes, the timezone really is that ridiculous value. No, the author and
committer aren't different. According to GNU date, the correct timestamp
is actually in 2152. Offhand, I'd guess that the timestamp exceeding
2^32 is getting converted somewhere inside git to a bogus value, and
that's how we end up with 2106.
Ah, nope. Everything is working as designed.
5758122296 _is_ in 2152, but that's before we apply the author's
timezone offset. :)
Timezones are supposed to be [+-]HHMM. So the -40643156 timezone is
parsed as -406431 hours, 56 minutes. Which is about 46 years. Hence git
printing 2106.
You _should_ be able to get the right answer by asking git for
--date=local, but it doesn't seem to work. Looks like it is because our
tm_to_time_t hits this code:
if (year < 0 || year > 129) /* algo only works for 1970-2099 */
return -1;
and the caller does not actually check the error. The resulting timezone
is the screwed-up -40643156, which is perhaps how it got into the commit
in the first place.
-Peff
From: Jeff King <hidden> Date: 2016-06-20 20:10:56
On Mon, Jun 20, 2016 at 09:49:47PM +0200, Eric Deplagne wrote:
On Mon, 20 Jun 2016 15:39:28 -0400, Jeff King wrote:
quoted
On Mon, Jun 20, 2016 at 12:05:07PM -0700, Norbert Kiesel wrote:
quoted
Hmm. On closer inspection that commit 23c07cc that github shows with
date 2152-06-19 is already in my local branch. I got confused because
locally it is shown with a different date: `git log -1 --format='%ci'
23c07cc` shows "2106-02-07 06:28:56 -40643156" which is invalid.
My system is running Debian unstable 64bit. Is git using the time
rendering methods from the C library (glibc 2.22-12)?
No, git's time code is (mostly) internal routines. Can you show us the
output of:
git cat-file commit 23c07cc | egrep '^author|committer'
Note also that some interfaces (like "git log", and GitHub) will show
the author date by default, which might be different than the committer
date. The "-40643156" timezone definitely looks suspicious, though. I'm
curious if it is bad handling in the time code, or if the commit has
corrupt ident lines.
-Peff
2106 is the year of unsigned 32-bit unix time bug, would there be any relation ?
In an extremely roundabout way, yes. That -40643156 time zone really is
"minus 46 years", but it was generated by _different_ code trying to
compute the author timezone on the fly and using a stray "-1". So I
suspect that no matter what time you ask for in the year 2152 (or
later), the same process would end up with the 2106 time, as the
timezone is custom-computed to end up back at the same error point.
-Peff
From: Jeff King <hidden> Date: 2016-06-20 21:12:35
We ended up testing some of these date formats throughout
the rest of the suite (e.g., via for-each-ref's
"$(authordate:...)" format), but we never did so
systematically. t0006 is the right place for unit-testing of
our date-handling code.
Signed-off-by: Jeff King <redacted>
---
t/helper/test-date.c | 26 ++++++++++++++++++++++++++
t/t0006-date.sh | 21 +++++++++++++++++++++
2 files changed, 47 insertions(+)
From: Jeff King <hidden> Date: 2016-06-20 21:14:28
When we want to know the local timezone offset at a given
timestamp, we compute it by asking for localtime() at the
given time, and comparing the offset to GMT at that time.
However, there's some juggling between time_t and "struct
tm" which happens, which involves calling our own
tm_to_time_t().
If that function returns an error (e.g., because it only
handles dates up to the year 2099), it returns "-1", which
we treat as a time_t, and is clearly bogus, leading to
bizarre timestamps (that seem to always adjust the time back
to (time_t)(uint32_t)-1, in the year 2106).
It's not a good idea for local_tzoffset() to simply die
here; it would make it hard to run "git log" on a repository
with funny timestamps. Instead, let's just treat such cases
as "zero offset".
Reported-by: Norbert Kiesel <redacted>
Signed-off-by: Jeff King <redacted>
---
date.c | 2 ++
t/t0006-date.sh | 5 +++++
2 files changed, 7 insertions(+)
@@ -74,6 +74,8 @@ static int local_tzoffset(unsigned long time)localtime_r(&t,&tm);t_local=tm_to_time_t(&tm);+if(t_local==-1)+return0;/* error; just use +0000 */if(t_local<t){eastwest=-1;offset=t-t_local;
From: Jeff King <hidden> Date: 2016-06-20 21:16:23
On Mon, Jun 20, 2016 at 04:00:12PM -0400, Jeff King wrote:
You _should_ be able to get the right answer by asking git for
--date=local, but it doesn't seem to work. Looks like it is because our
tm_to_time_t hits this code:
if (year < 0 || year > 129) /* algo only works for 1970-2099 */
return -1;
and the caller does not actually check the error. The resulting timezone
is the screwed-up -40643156, which is perhaps how it got into the commit
in the first place.
So here's a patch to fix that (along with some test infrastructure to
support it). I still don't know how that screwed-up timestamp got _into_
a commit, so perhaps there is another bug lurking. I couldn't convince
git to parse anything beyond 2100, and committing with
GIT_AUTHOR_DATE='@5758122296 +0000' works just fine.
[1/3]: t0006: rename test-date's "show" to "relative"
[2/3]: t0006: test various date formats
[3/3]: local_tzoffset: detect errors from tm_to_time_t
-Peff
From: Jeff King <hidden> Date: 2016-06-20 21:38:19
The "show" tests are really only checking relative formats;
we should make that more clear.
This also frees up the "show" name to later check other
formats. We could later fold "relative" into a more generic
"show" command, but it's not worth it. Relative times are a
special case already because we have to munge the concept of
"now" in our tests.
Signed-off-by: Jeff King <redacted>
---
t/helper/test-date.c | 8 ++++----
t/t0006-date.sh | 26 +++++++++++++-------------
2 files changed, 17 insertions(+), 17 deletions(-)