Git-删除Blob

Git-删除Blob,git,Git,有没有一种方法或命令可以使用blob的ID从git中删除blob 我使用了命令 $ git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(rest)' | grep '^[^ ]* blob' | cut -d" " -f1,3- 并且得到了所有版本的blob列表,比如 62f7e0df0b80bce8d0a4cb388be8988df1bec5ef NodeApplic

有没有一种方法或命令可以使用blob的ID从git中删除blob

我使用了命令

$ git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(rest)' | grep '^[^ ]* blob' | cut -d" " -f1,3-
并且得到了所有版本的blob列表,比如

62f7e0df0b80bce8d0a4cb388be8988df1bec5ef NodeApplication/NodeApplication/public/javascripts/homescript.js
b1d69387fbd4d4e84bbe9eb2c7f59053c0355e11 NodeApplication/NodeApplication/iisnode/index.html
624642d6f2a86844dc145803260537be0fe40090 NodeApplication/NodeApplication/.ntvs_analysis.dat
现在我想删除blob

NodeApplication/NodeApplication/.ntvs_analysis.dat. 
我如何做到这一点?

这样做的“正确”方法是使用git的垃圾收集器

首先查找引用blob的所有树。然后查找引用其中一棵树的所有提交

完全删除这些提交(从所有头的历史记录、所有标记和reflog中),垃圾收集器将清除blob

如果不先删除引用blob的对象而删除blob,则会损坏存储库


自动化整个过程的一个简单方法是使用
git filter branch
,它使您能够生成一个备用历史记录,其中该特定文件从未签入。

我使用bfg cleaner来清理不需要的大文件,然后执行了此操作

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

如果您已经有blob ID,您可以使用
git-verify-pack

git验证包-v.git/objects/pack/*.idx | grep

一旦你有了文件名,你应该

  • 从git中删除对blob的所有引用,然后
  • 使用
    git filter branch
    重写历史,从分支中的每个提交中删除blob
这样,git垃圾收集器
git gc
将清理它并释放空间

看一下脚本
git忘记blob
,一步完成所有这一切

git忘记要忘记的blob文件

基本上,这会删除所有标记和远程引用,就像这样

git标签| xargs git标签-d
git筛选器分支--索引筛选器“git rm--缓存--忽略不匹配的$FILE”
rm-rf.git/refs/original/.git/refs/remotes/.git/*\u HEAD.git/logs/
每个ref的git——format=“%(refname)”refs/original/|\
xargs-n1——如果git update ref-d为空,则不运行
git reflog expire--expire unreachable=now--all
git重新包装-A-d

git prune

我已经完成了git过滤器分支,现在提交被重写,但是blob仍然存在于git中repo@keerthee查看
过滤器分支的手册页
——请参阅标有“缩小存储库检查表”的部分。如果正确删除引用、清除reflog并强制执行gc,垃圾将消失。实际上,我做了上述操作,减小了repo大小并在TFS中推送到repo,TFS不允许删除文件或gc,因此只有提交被重写。现在我从TFS克隆,它仍然是旧的大小,但提交被重写(因此,如果我进行筛选分支,则这些文件不存在).我甚至试过gceverything@keerthee那么你的问题是TFS而不是git。我知道,但是有没有办法清除本地克隆的repo你需要
git filter branch
,请看实际上我做了git filter,gc所有减少我的repo大小并在TFS中推送到repo的东西,TFS不允许删除文件或gc,所以仅此而已y提交被重写。现在我从TFS克隆,它仍然是旧的大小,但提交被重写(因此,如果我执行筛选分支,则这些文件不存在)我甚至尝试过GC,如果ID.没有直接回答这个问题,请考虑解释如何使用BFG <代码>带IDS < /COD> CLI标志的条形斑点。参见BFG,但需要更多解释。OSX:1。<代码> BFG < B/G > 2。<代码> BFG——带IDS < /代码> 3的条带斑点。ode>git reflog expire--expire=now--all&&git-gc--prune=now--aggressive为什么两次调用git-gc?