从git中删除文件而不干扰远程

时间:2014-04-10 12:42:50

标签: git

我正在开发一个开源项目,并且我已将他们的存储库分配给我的Github。不幸的是,他们的github包含了许多我不会使用的资源 - 即大型资产文件,它们将存储库大小增加了大约一百兆字节。更糟糕的是,我已经致力于我的存储库并推送到它,因此我的存储库的历史记录将这些文件版本化 - 这意味着如果这些文件在主存储库中发生更改,那么我的提交将与他们的存在冲突,将无法自动合并。

有什么方法可以排除我已经提交/推送到我的存储库但没有影响fork存储库的某些文件?理想情况下,我想让git认为那些文件永远不在我的存储库中。

1 个答案:

答案 0 :(得分:0)

您可以使用git filter-branch删除项目整个历史记录中的文件。然而,这将重写整个历史记录中的每个提交,并且出于所有实际目的,您的fork将成为一个完全独立的项目,具有不同的提交,顺便说一下"与源存储库共享文件。

一旦你这样做了,你就可以强行推进你的分叉,即使在历史上,原始文件也不会再存在。这将使git成为"那些文件永远不会出现在我的存储库中#34;但我不确定这是好事还是你考虑所有后果

更新

这是你怎么做的。

  • 首先备份您的存储库
  • 假设您想要重写历史记录的位置为master,请运行此git filter-branch --tree-filter 'rm -f <list of assets to delete>'
  • 这将重写整个树。做一个git log来仔细检查。
  • 一旦你开心,git push --force这就到你的叉子了。你甚至可以删除你的fork并推送到一个新的存储库,因为它总是会有所不同。

其他分支仍将具有旧提交的引用和链接,因此如果要从存储库中删除实际的blob,则必须删除未重写的所有引用(标记,分支等),然后运行存储库上的git gc