2

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

4

3 回答 3

2

因为git filter-branch这是一个危险的操作,所以你的旧分支头的备份保存在.git/refs/original. 这可以防止git gc删除这些头引用的任何对象。

您只需要删除.git/refs/originalgit gc再次运行或简单地克隆您的本地存储库,以便从您的存储库中实际删除所有这些大 blob。

于 2013-07-16T14:55:12.660 回答
1

您必须更新 git 存储库,请使用以下命令:

git add -u .
git commit -m "some commit"

然后享受你的生活:D

于 2013-07-16T14:06:57.133 回答
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最终缩小存储库以删除已删除的文件。
于 2013-07-17T10:17:27.923 回答