我有几个大文件,我通过开发更新了几次,他们正在增加我的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
你实际上无法删除任何历史Git提交中的任何内容。
git filter-branch
和BFG做的是构建新的提交 - 一个新的历史 - 同时省略这些新提交的文件。你不应该期望文件从旧的提交中消失。您只需停止使用旧提交,并假装文件已消失。
如果您和存储库的所有其他用户不再使用旧提交,并且没有可以找到旧提交的名称,Git最终会“垃圾收集”未使用的提交并将它们从存储库中抛出。此时,通过哈希ID请求旧提交将失败:Git只会感到困惑,说实际上,我找不到该哈希ID下的任何对象。
但是,直到Git实际上已经收集了提交,但是,通过该哈希ID对该提交的任何请求都将获得该提交,这当然会带来其中的所有文件。请注意,只要您有一个名称 - 分支或标记名称,或任何其他外部引用(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 --force
或git fetch
或类似),以便它们的Gits没有可以找到旧提交的名称。最终 - 对于存储库的所有其他副本,您无法控制何时 - 其他Gits将执行自己的垃圾收集并删除提交。
特别是GitHub将继续通过Web界面提供旧提交一段时间(我不清楚多长时间)。