好吧,天哪,这是怎么发生的?
有人使用了错误版本的 Git(或者构建 Git 对象的错误工具)。谁、何时、如何等等,不可能说出来,但是如果你检查各种错误的提交,那可能会提供一些非常大的线索,因为错误的行应该具有以下一般形式:
author A U Thor <[email protected] /cdn-cgi/l/email-protection> 1575578639 -0800
or:
committer A U Thor <[email protected] /cdn-cgi/l/email-protection> 1575578639 -0800
日期和时间戳是最后两个数字字段。介于两者之间的内容可能会告诉您该向谁询问他们使用的 Git 版本。
我什至不知道如何开始解决这个问题。
从技术上来说,你can't自行修复错误的提交。原因是,无论好坏,原始数据in提交是提交的哈希 ID 的来源。由于哈希IDis提交的真实姓名,提交的真实姓名要求该提交的数据是坏的。如果你did修复它们,它们将成为不同的提交,这些提交将具有不同的哈希 ID 名称。
As 冯克说 https://stackoverflow.com/a/59231457/1256452,要生成一个新的、不兼容但已纠正的存储库,您必须用新的和改进的提交替换每个错误的提交,也许使用git filter-branch
或新的git filter-repo
。无论您使用什么工具或方法,您都需要提供某种方法来替换坏的author
and/or committer
错误提交的提交头中的行,以及新的正确行——满足 Git 内部要求的日期和时间戳。
用更正的提交替换了错误的提交后,您现在还必须替换每个后续(后代)提交,因为这些提交的直接子级将其父哈希 ID(错误提交的哈希 ID)存储在其中作为其数据的一部分。因此,您必须编写一个新的更正的子提交来保留所有内容except父哈希 ID。这会使子提交的子提交无效,因此也必须重写这些子提交,依此类推:所有后代提交。
这正是这些过滤器分支/过滤器回购工具的作用do。您(以某种方式)在存储库中挑选出一个错误的提交,然后他们将其复制到新的和改进的提交中。然后,他们也复制原始错误提交的所有后代,以便从更正的提交衍生出一个新的家谱。
由于存储库中的提交集is复制所有这些提交的结果是一个全新的历史记录 - 一个新的存储库,旧存储库的所有用户现在必须切换到使用。因此,纠正存储库的技术部分通常是整个过程中最简单的部分。找出问题所在以及如何使用工具重写历史需要一些工作,但只要这样做一次就可以了。但是,您必须跟踪旧存储库的每个用户,并以某种方式说服他们停止使用该存储库并开始使用新的和改进的存储库。