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

sdnqo3pr  于 2023-04-10  发布在  Git
关注(0)|答案(4)|浏览(241)

如何删除一个never-use-again文件并释放存储空间回到github lfs配额?
在这种情况下,删除git history中文件的引用点是否有效?

dba5bblo

dba5bblo1#

目前似乎还没有一个很好的方法来从git-lfs中删除大型资产。GitHub目前的建议是使用一个名为The BFG的工具来完全从您的存储库中删除所有存在的文件。
当GitHub下一次运行git的垃圾收集时,它可能会从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存储,尽管目前这似乎无法正常工作。
BitBucket在仓库设置中有一个可以清理lfs文件的部分。https://www.atlassian.com/git/tutorials/git-lfs#deleting-remote-files

i2loujxw

i2loujxw2#

韦德给出的答案与问题无关。
给出的github文章链接是关于直接签入git repo的大文件,这与git-lfs不同!
至于问题:如何处理这种情况取决于底层存储服务器。git-lfs支持可以由不同的服务提供,例如GitHub或GitLab。
GitLab并不是按仓库存储git-lfs文件。它们是按SHA-256哈希值存储的。如果同一个文件在多个仓库中使用(例如克隆),它只存储一次。这完全取决于GitLab如何处理引用的文件,应该在手册中查找。
根据GitHubs文档(https://help.github.com/articles/removing-files-from-git-large-file-storage/),建议删除并重新创建一个仓库:要从存储库中删除Git LFS对象,请删除并重新创建存储库。删除存储库时,所有关联的issue、star和fork也将被删除。

scyqe7ek

scyqe7ek3#

克里斯给出的答案并不准确;结合来自0xcaff的评论(“* 这是一个糟糕的解决方案 ”),它可能会误导缺乏经验的用户(或分心的读者)。
正确答案是韦德和克里斯的混合。
我刚刚解决了一个案例,我想镜像一个存储库(我们称之为REPO-1),它曾经使用过LFS,但还没有从大文件中清除历史。
在上个月的某个时候,我用git lfs uninstall删除了REPO-1中对LFS的支持。这对后续的git clone s工作正常(
即 *,不再有git-lfs)。但是今天当我尝试pull以前的push --mirror版本的REPO-1时,我得到了消息Smudge error: Error downloading <big-filename> ... Object does not exist on the server: [404] Object does not exist on the server
所以,如果你想摆脱LFS和任何对曾经跟踪过的文件的引用,你必须:
1.从repo中卸载LFS;
1.清除回购的历史记录;
1.删除(或重命名)旧的(github)repo,创建一个新的,并将清理后的repo推送到其中。

1

要 * 卸载 * LFS是一个简单的命令,如git lfs uninstall将做到这一点。

清理repo的历史有点吓人,但是用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中的内容。当你将本地(干净)版本推送到新的空白仓库时,它就像(删除/创建)从未发生过一样。

6yt4nkrj

6yt4nkrj4#

我知道删除repo并不是最好的选择,我也不敢相信这是GitHub在2022年推荐的解决方案。正如GitHub文档中所指出的:
要从存储库中删除Git LFS对象,请删除并重新创建存储库。删除存储库时,任何关联的issue、star和fork也会被删除。有关详细信息,请参阅“删除存储库”。如果您需要清除已删除的对象,但无法删除存储库,请联系支持人员以获得帮助。
如果您的问题是only在原始存储库中创建的问题,您可以在删除原始存储库之前将其迁移到新的重新创建的存储库中,如in this post所示。
GitHub UI允许你像这样迁移单个问题:

gh issue transfer <issue ID> <destination repo>

但如果一些回购有超过一百个问题(我的情况也是如此),这将需要几个小时。将它与一些shell管道结合起来,我们可以:

gh issue list -s all -L 500 --json number | \
    jq -r '.[] | .number' | \
    xargs -I% gh issue transfer % https://github.com/<destination repo>

所有这一切将做的是抓取最后500问题从原来的仓库,并将它们转移到您的新<destination repo>。如果你必须转移超过500问题增加这个值或只是运行它多次。注意,因为命令必须在正确的原始仓库目录中执行。
到目前为止一切顺利,之后你可以清除原始的repo并从GitHub中删除LFS存储。

请注意,当你删除一个仓库时,星型和分叉也会被删除,这不是我的情况,但可能是你的情况。如果是这样,在盲目删除你的仓库之前,请寻找补充的解决方案。

相关问题