修复坏的badEmail:无效的作者/提交人行-Git存储库中的坏电子邮件



我有一个git存储库,我正试图从bitbucket移动到github。这是我以前毫不费力地完成的事情,既使用github导入器工具,也手动发送回购。然而,在这种特殊的情况下,我的存储库的历史记录中似乎有一个问题,导致github失败。值得注意的是,当我运行git fsck时,我得到:

git fsck
Checking object directories: 100% (256/256), done.
error in commit 18e86b4bdd4172bfca9f635abfedc84a8bf39bd7: badEmail: invalid author/committer line - bad email
Checking objects: 100% (90779/90779), done.

Git fsck似乎告诉我有一个错误的提交,但当我看到这个提交时,我没有看到它不正确的明显原因(例如,可能是电子邮件中隐藏的流氓角色?(。无论如何,为了解决这个问题,我尝试的第一件事就是重新设置基准。我尝试遵循的教程似乎建议获取父级提交,重新设置基础,然后切换到编辑,而不是在列表中选择。当我这样做时,我会遇到合并冲突:

Auto-merging HourOfCode/SourceCode/Biology.quorum
CONFLICT (content): Merge conflict in HourOfCode/SourceCode/Biology.quorum
error: could not apply 18e86b4bd... Updated Breed method, IsParent method, added Tasks 2 - 6 sample code.

如果我尝试运行教程中的下一个命令(典型的修改命令(,我会得到:

git commit --amend --author="My Name <nyname@name.com>"
U   HourOfCode/SourceCode/Biology.quorum
error: Committing is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.

现在,我知道我可以添加文件,但考虑到rebase可能对回购产生的影响,我是否有任何权利还不清楚。我知道如果这样的改变发生了,每个人都必须重新克隆,但我的问题是,我该如何解决这个"问题";糟糕的电子邮件";变成可以接受的东西,并在不损坏我的公共存储库的情况下推动这种改变历史的改变?

这是有问题的实际提交(原始内容(,问题是:

$ git cat-file -p 18e86b4bdd4172bfca9f635abfedc84a8bf39bd7
tree 3c1ca25101ec266daa5b7cc8f71b9cbcb5365b73
parent 03f8e6b99fbd996fffe03bda5aeeb17c325893b3
author timkwist <timkwist@hotmail.com> 1402964633 -0700
committer timkwist <timkwist@hotmail.com <> 1402964633 -0700
Updated Breed method, IsParent method, added Tasks 2 - 6 sample code.$ 

committer行不应在(可能是正确的(电子邮件地址之后、两个数值之前有额外的<>。(提交消息也不会以换行结束,正如您可以从同一行显示的提示中看到的那样,但git fsck不会反对这一点。(

。。。无论如何,为了解决这个问题,我尝试的第一件事就是重新设置基准。

此处不要使用rebase!(理论上你可以使用git rebase --rebase-merges,但这仍然是错误的做法。(

要替换这样的错误提交,请使用git replace --edit,然后使用git filter-branch(现在已过时(或git filter-repo(新的更好的方法,但仍然不是Git发行版的一部分(。但是:

。。。但考虑到回购可能产生的影响,目前尚不清楚我是否有这种权利。我知道如果这样的改变通过,每个人都必须重新克隆

无论您如何进行更改,都是如此。原因是提交的哈希ID是提交;对任何部分进行任何更改,包括删除committer行上的伪<>,都会产生一个带有新的不同唯一哈希ID的新的不同提交。存储库中的所有后续提交都必须直接(针对其子级(或间接(针对其大n子级,n≥1(引用回新提交。

如果其他约束条件允许,您最好的选择就是忽略问题。Git本身在读取和使用此提交及其文件时没有任何问题。它只是不能满足的正式要求(因此其他一些读取Git数据的非Git软件可能会反对它,因为接受它是一种扩展(。这就是git fsck抱怨它的原因。你可以为整个克隆禁用这个特定的错误消息:

git config fsck.badEmail ignore

或者通过哈希ID进行某些已知的错误提交。我不确定你是否(以及如何(让GitHub或Bitbucket为你做这件事。参见例如。,https://github.blog/2015-09-29-git-2-6-including-flexible-fsck-and-improved-status/(其中提到了fsck.badEmail设置,以及跳过列表技巧,但不是在GitHub本身上设置的方法,当然你正试图在Bitbucket上这样做(。

当然,我刚刚能够从Bitbucket中克隆整个存储库来找到这一点,所以看起来它是安全的。

最新更新