您可以应用的任何解决方案都将重写历史记录。这意味着它会对拥有您的代码库副本的其他人产生不利影响,如果他们在尝试恢复时做错了事情,可能会撤销您的修复。
因此,在公开可用的代码库中出现这种情况是一个非常不幸的情况,但如果您知道没有多少人(或者可能没有人)克隆了它,实际上可能不会太糟糕。重点是以一种所有代码库用户都能了解的方式进行沟通。
(通常我会说您需要获得拥有代码库副本的任何人的同意/协调;在这里,如果您将其视为您让其他人克隆的代码库,我想您可以说只需要一定的协调措施就可以了;但是除非您限制推送到原始位置,否则某人重新引入错误提交并重新引入问题的可能性存在,无论我们怎么说都是“正确”的。)
无论如何,请注意上述内容,但它确实无法避免。您必须重写历史记录,问题是如何处理。
你可以删除自添加
node_modules
文件夹以来所做的所有提交,但这样做会丢失那些提交中的其他更改。最简单的方法是使用
git filter-branch
来去除
node_modules
而不会丢失其他历史记录(也无需第三方工具)。
当然,您需要确保在本地拥有所有引用。因为您的存储库可能是真正的原始存储库,您已经将其复制到了 GitHub 上,所以应该没问题。但如果需要,您可以获取或甚至使用
--mirror
克隆原始存储库来开始操作。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch -r node_modules' -- --all
如果您有更改仅限于
node_modules
的提交,并希望放弃这些提交,您可以在
--
分隔符之前添加
--prune-empty
选项。
(对于具有大量历史记录(许多提交)的存储库,这可能会很慢;在这种情况下,您可以考虑使用第三方工具BFG Repo Cleaner,它是一种更专业的用于从历史记录中删除大型/不需要文件的工具(而不是
filter-branch
,后者是一种更通用的工具)。)
运行此操作后,请检查您的历史记录是否正确,然后您将需要清理本地存储库。最简单的方法可能是使用它来创建一个新克隆。
cd ..
git clone file://localhost/path/to/old/repo newrepo
如果您希望清理原始的本地仓库,您需要删除由
filter-branch
创建的一组“备份引用”(在
refs/original
下),可能还要清除引用日志,然后使用
gc
实际丢弃不需要的对象。
至于github上的仓库,如果您有许多重写的分支,删除并重新创建可能是最简单的方法。或者,您可以强制推送(
git push -f
)每个重写的分支,并查看github文档以获取有关服务器端
gc
的信息。