【发布时间】:2017-11-03 00:14:09
【问题描述】:
BFG 用于从历史记录中删除文件。在此过程中,写入了 deleted-files.txt。
以前的克隆仍然包含已删除的文件... git cat-file -p xxx (xxx 在deleted-files.txt 中说明)
有没有办法恢复原来的历史?意味着添加使用 BFG 删除的所有版本?简单地撤销 BFG 所做的一切。
【问题讨论】:
标签: git bfg-repo-cleaner
BFG 用于从历史记录中删除文件。在此过程中,写入了 deleted-files.txt。
以前的克隆仍然包含已删除的文件... git cat-file -p xxx (xxx 在deleted-files.txt 中说明)
有没有办法恢复原来的历史?意味着添加使用 BFG 删除的所有版本?简单地撤销 BFG 所做的一切。
【问题讨论】:
标签: git bfg-repo-cleaner
除了这个没有简单方法:如果你有前一个克隆,就用它。
任何 Git 存储库中的历史记录都包含该存储库中的提交。
删除文件在技术上是不可能的。 BFG 没有这样做,git filter-branch 也没有。相反,这些命令会生成一个 new 系列的提交,这些提交有点像旧的提交,只是缺少文件。然后他们更改分支名称(以及可选的附加引用),以便这些分支名称不会记住旧的提交,而是记住新的提交。等等,你有一个 new 存储库,不再与旧版本兼容,new 提交形成了一个新的和不同的历史。
这两个命令还会生成一个与旧提交和新提交相关的映射文件。 BFG 保留此映射文件(这是正确的做法),而git filter-branch 在过滤过程结束时将其丢弃(这是错误的做法)。如果你有地图,你就有一种方法——不是简单的方法,而是一种方法——将新历史与旧历史关联起来。
这将允许你按照你的建议去做。但是,要使其正常工作,您必须有权访问旧存储库……在这种情况下,您不妨只使用旧存储库。
您可能不想只切换回旧存储库的唯一原因是,您是否在进行转换后进行了新提交。
如果您可以识别特定的新提交,并且您拥有旧存储库,则可以将每个新提交转换为补丁或git merge 命令,然后应用该补丁或运行该git merge。这并不简单,但允许您将“仅新 repo”提交复制回旧存储库。做到这一点的方法不止一种,各有优缺点,但也不会很简单——无论如何,这取决于能否列出这些“过滤后的新”提交。
【讨论】: