为什么文件仍在存储库中,即使我已将其删除?

时间:2013-07-16 14:02:30

标签: git

有没有办法告诉为什么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相信它必须存在?

3 个答案:

答案 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
  • 希望您可以通过SSH连接到您的服务器,因为您还没有完成!
  • 在您的服务器存储库中,您再次需要调用git gcgit repack以最终缩小存储库以删除已删除的文件。