如何删除git-lfs跟踪的文件并释放存储配额?

How to delete a file tracked by git-lfs and release the storage quota?

如何删除不再使用的文件并将存储释放回 github lfs 配额?

在这种情况下删除git历史中文件的引用点是否有效?

目前似乎没有从 git-lfs 中删除大型资产的好方法。 GitHub 目前的建议是使用一个名为 The BFG 的工具从你的 repo 中完全删除所有存在的文件。

据推测,当 git 的垃圾收集是 GitHub 的下一个 运行 时,它将从 lfs 存储中删除。

有关详细信息,请参阅 https://help.github.com/en/github/managing-large-files/removing-files-from-git-large-file-storage

编辑 2019-11-20

GitHub 已经更新了他们的文档,明确指出如果不删除您的存储库就无法释放您的 git-lfs 存储空间。 https://help.github.com/en/github/managing-large-files/removing-files-from-git-large-file-storage

他们唯一的建议是仍然使用 BFG 工具从您的存储库中删除文件,这将在克隆时减少存储库的大小,但仍会计入您的 git-lfs 配额,直到您删除存储库。

GitLab 再次建议使用 BFG 工具并将自动清除任何提交中未引用的任何文件的 lfs 存储,尽管目前这似乎无法正常工作。 This 问题自 2017 年以来一直未解决,但没有解决。

BitBucket 在存储库设置中有一个部分可以清理 lfs 文件。 https://www.atlassian.com/git/tutorials/git-lfs#deleting-remote-files

Wader给出的答案与问题无关

给定 link 的 github 文章是关于直接签入 git 存储库的大文件,这与 git-lfs 不同!

至于问题:这种情况如何处理取决于底层存储服务器。 git-lfs 支持可以由不同的服务提供,例如GitHub 或 GitLab。

GitLab 存储 git-lfs 文件而不是每个存储库。它们按 SHA-256 哈希值存储。如果同一个文件在多个存储库中使用(例如克隆),则它只存储一次。它完全取决于 GitLab 如何处理引用的文件,应该在手册中查找。

根据 GitHub 的文档 (https://help.github.com/articles/removing-files-from-git-large-file-storage/),建议删除并重新创建存储库:"To remove Git LFS objects from a repository, delete and recreate the repository. When you delete a repository, any associated issues, stars, and forks are also deleted."

克里斯给出的答案不准确;结合 0xcaff 的评论(“这是一个糟糕的解决方案”),它可能会误导没有经验的用户(或分心reader)。

正确答案是韦德和克里斯的混合答案。

我刚刚解决了一个案例,我想镜像一个存储库(让我们称之为 REPO-1),曾几何时 使用 LFS,但还没有成为历史-从大文件中清除。

At some moment in the last month I removed support for LFS in REPO-1 with git lfs uninstall. And that was working fine for subsequent git clones (i.e., no git-lfs anymore). But today when I tried to pull a previously push --mirror version of REPO-1 I got messages Smudge error: Error downloading <big-filename> ... Object does not exist on the server: [404] Object does not exist on the server

因此,如果您想摆脱 LFS 和任何对曾经跟踪的文件的引用,您必须:

  1. 从存储库中卸载 LFS;
  2. 清理回购历史;
  3. 删除(或重命名)旧的 (github) 存储库,创建一个新存储库并将清理后的存储库推送到其中。

1

卸载 LFS 是一个简单的命令,就像git lfs uninstall 一样。

2

清除存储库的历史记录有点可怕,但与 git filter-branch、Github 文档的项目 3 一起工作得很好 --https://help.github.com/en/articles/removing-sensitive-data-from-a-repository -- 应该足够了:

$ git filter-branch --force --index-filter \
      "git rm --cached --ignore-unmatch FILENAME-1 FILENAME-2 FILENAME-3" \
      --prune-empty --tag-name-filter cat -- --all

3

存储库的删除和重新创建并不像看起来那样具有破坏性,请记住您的本地存储库是完全独立的,自我维持的克隆 Github。当您将本地(干净)版本推送到新的空白存储库时,它就像那样(deletion/creation)从未发生过。