1

I have a git repo that was converted from RCS via CVS many years ago. When I tried to push it to GitHub it was rejected because the initial two commits had bad dates:

$ git fsck
Checking object directories: 100% (256/256), done.
error in commit 38f10a1a015625149ea06f2f633e9ba446912b27: badDateOverflow: invalid author/committer line - date causes integer overflow
error in commit 0436a5befd4fee58693c2293e72be53b84705539: badDateOverflow: invalid author/committer line - date causes integer overflow

When I look at these commits, it is clear that the dates are bad (they are negative):

$ git cat-file -p 
tree 75e9d9b58efcc2b706e38967cff75935e656fdf1
parent 0436a5befd4fee58693c2293e72be53b84705539
author John Tang Boyland <boyland@uwm.edu> -59025288066 +0000
committer John Tang Boyland <boyland@uwm.edu> -59025288066 +0000

Updated for CS654 Spring 1999.

This seems like something git-filter-repo should be able to handle. I saw flags for fixing emails and names and commit messages but nothing for dates. I tried a run where I just pruned unreachable commits, and it left the bad dates in place. Then I tried to use git fast-export and edited the negative numbers with the correct unix time stamps. When I used git fast-import into an empty repository, I got plenty of stats but the empty repository stayed empty, probably because the commit structure was disrupted. I'm guessing the only way to fix this is to use the commit callback of git-filter-repo, but I'm not sure how to fix the dates.

I tried

$ git-filter-repo --commit-callback '
        if (commit.committer_date == -59025288066) :
          commit.committer_date = 932873934
'

and it ran fine, but it had no effect on the bad dates. I tried doing the same thing but double-quoted the dates (in case they were read as strings), again to no avail.

I saw an existing question on the same topic, but the answers don't say how to use git-filter-repo to fix dates: How can I fix "bad date" issues in a git repository?

4

1 回答 1

1

好的,经过一些实验,我发现了如何使用钩子。双引号日期戳是不够的,它也必须有+0000一部分。甚至这还不够。我不得不“b”引用字符串。解决方案是使用钩子运行git-filter-repo,例如

git-filter-repo --commit-callback '
        if (commit.committer_date == b"-59025288066 +0000") :
          commit.committer_date = b"932873934 +0000"
'

当然,然后我也必须对author_date另一个提交做同样的事情。

于 2022-01-08T19:36:23.147 回答