Git - 删除Blob

时间:2015-08-06 12:12:22

标签: git

是否有使用其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. 

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我用bfg清洁剂清理不需要的大文件,然后

system.conf

答案 1 :(得分:0)

"适当"这样做的方法是使用git的垃圾收集器。

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

完全删除这些提交(来自所有头部历史记录,所有标记和reflog),垃圾收集器将清理blob。

删除blob而不先删除引用它的对象会破坏您的存储库。

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

答案 2 :(得分:0)

如果您已经拥有blob ID,则可以使用git verify-pack找到文件名(或反之亦然)

git verify-pack -v .git/objects/pack/*.idx | grep <reference_id or filename>

获得文件名后,您应该

  • 从git中删除对blob的所有引用,然后
  • 使用git filter-branch重写历史记录,以从分支中的每个提交中删除blob。

这样,git垃圾收集器git gc将清理它并释放空间。

查看脚本git forget-blob,一步完成所有这些操作

git forget-blob file-to-forget

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

基本上这会删除所有标签,远程引用,如此

git tag | xargs git tag -d git filter-branch --index-filter "git rm --cached --ignore-unmatch $FILE" rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/ git for-each-ref --format="%(refname)" refs/original/ | \ xargs -n1 --no-run-if-empty git update-ref -d git reflog expire --expire-unreachable=now --all git repack -A -d git prune