有没有办法告诉为什么Git持有一个文件,即使我认为它必须放手?我正在尝试通过删除大文件来重写提交历史记录。这是我做的:
git filter-branch -f --tree-filter "rm -rf *.mp4" 573edba..HEAD
我也试过了:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.mp4' 573edba..HEAD
我看到他们被报告为已删除。我也跑了git gc
。
我在存储库中有两个分支,所以我在主分支和开发分支上运行它。
现在,如果我这样做:
git ls-files | grep '.mp4'
或
git show --pretty="format:" --name-only 573edba..HEAD | grep '.mp4'
我没有结果。
但是,当我像这样检查索引文件时:
git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr
然后我拿第一个SHA1,看看它是什么:
git rev-list --all --objects | grep $SHA1
我得到/path/to/file.mp4
问题:如何永久删除该文件?我怎么知道为什么该文件仍在存储库中?是什么让Git相信它必须存在?
答案 0 :(得分:2)
由于git filter-branch
是一项非常危险的操作,因此旧分支头的备份将保留在.git/refs/original
中。这可以防止git gc
删除这些头所引用的任何对象。
您只需要删除.git/refs/original
并再次运行git gc
,或者只是克隆您的本地仓库,以便从您的仓库中实际删除所有这些大blob。
答案 1 :(得分:1)
您必须更新git存储库,使用以下命令:
git add -u .
git commit -m "some commit"
然后享受你的生活:D
答案 2 :(得分:1)
尽管之前已经给出了一些好的建议,但我会回答我自己的问题。这是因为很少有其他事情没有提到。
我需要做的重要事情才能让它发挥作用:
git filter-branch
之后我需要删除文件.git/refs/original
。git gc --prune=now
。git repack -a -d
。git remote rm origin
。也许序列不正确,但重复其中一些步骤最终会让您实现目标。
推。确保服务器设置
[receive]
denyNonFastforwards = false
git push -f
git gc
和git repack
以最终缩小存储库以删除已删除的文件。