完全从历史记录中删除文件夹/文件

时间:2017-12-17 14:31:03

标签: git github

我有几个大文件,我通过开发更新了几次,他们正在增加我的git的大小。

我尝试使用bfg删除它并遵循教程但由于某种原因它会在我的历史记录中留下该文件的实例。

我正在使用bfg,这就是我所做的

git clone --mirror https://github.com/shultays/bloodworks.git
java -jar ../bfg.jar --delete-folders "steam" bloodworks.git
cd bloodworks.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

一个大文件是steam.mp4下的steam文件夹。这是github中的样子

https://github.com/shultays/bloodworks/search?q=trailer&type=Commits&utf8=%E2%9C%93

你可以看到它仍然在历史中,我仍然可以使用此提交下载文件

https://github.com/shultays/bloodworks/commit/2c3186173e4cb1381479ef9a4432630cbd16e125

前两个提交有0个更改,所以我认为它有效,但在最后两个我仍然可以下载该文件。例如:

https://github.com/shultays/bloodworks/commit/2c3186173e4cb1381479ef9a4432630cbd16e125

1 个答案:

答案 0 :(得分:0)

您实际上无法从任何历史Git提交中删除任何内容。

git filter-branch和BFG做的是构建 new 提交 - 一个新的历史记录 - 同时省略这些新提交中的文件。你不应该期望文件从旧的提交中消失。您只需停止使用旧提交,假装文件就会消失。

如果您和存储库的所有其他用户不再使用旧提交,并且没有可以找到旧提交的名称,Git最终会“垃圾收集”未使用的提交并将其从存储库中抛出。此时,通过哈希ID请求旧提交将失败:Git只会感到困惑,实际上,我找不到该哈希ID下的任何对象。

直到Git实际上已经垃圾收集了提交,但是,通过该哈希ID对该提交的任何请求都将获得该提交,这当然会带来其中的所有文件。请注意,只要您有一个名称 -a分支或标记名称,或任何其他外部引用(如Git所称 - 通过Git可以通过搜索找到提交从历史记录开始,从命名对象开始,旧提交将作为垃圾被拖走。有关可达性的更多信息,请参阅Think Like (a) Git

您:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

命令是让你的Git删除额外引用并立即执行垃圾收集传递的一种方法。然后,您可以使用git show <hash-id>查看您自己的Git是否已将提交归咎于垃圾箱。但这只是您的存储库副本。

同样的逻辑适用于存储库的每个副本。存储库的所有副本都必须更新其引用(通常通过git push --forcegit fetch或类似),以便它们的Gits没有可以找到旧提交的名称。最终 - 对于存储库的所有其他副本, 您无法控制何时 - 其他Gits将自行执行垃圾回收和删除提交。

GitHub特别会继续通过网络界面提供旧提交一段时间(我不清楚多久)。

相关问题