克里斯给出的答案并不准确;结合来自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推送到其中。
4条答案
按热度按时间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
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也将被删除。
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--应该足够了:3
仓库的删除和重新创建并不像看起来那样具有破坏性,记住你的本地仓库是完全独立的,自我维持的 * 克隆 * Github中的内容。当你将本地(干净)版本推送到新的空白仓库时,它就像(删除/创建)从未发生过一样。
6yt4nkrj4#
我知道删除repo并不是最好的选择,我也不敢相信这是GitHub在2022年推荐的解决方案。正如GitHub文档中所指出的:
要从存储库中删除Git LFS对象,请删除并重新创建存储库。删除存储库时,任何关联的issue、star和fork也会被删除。有关详细信息,请参阅“删除存储库”。如果您需要清除已删除的对象,但无法删除存储库,请联系支持人员以获得帮助。
如果您的问题是only在原始存储库中创建的问题,您可以在删除原始存储库之前将其迁移到新的重新创建的存储库中,如in this post所示。
GitHub UI允许你像这样迁移单个问题:
但如果一些回购有超过一百个问题(我的情况也是如此),这将需要几个小时。将它与一些shell管道结合起来,我们可以:
所有这一切将做的是抓取最后500问题从原来的仓库,并将它们转移到您的新
<destination repo>
。如果你必须转移超过500问题增加这个值或只是运行它多次。注意,因为命令必须在正确的原始仓库目录中执行。到目前为止一切顺利,之后你可以清除原始的repo并从GitHub中删除LFS存储。
请注意,当你删除一个仓库时,星型和分叉也会被删除,这不是我的情况,但可能是你的情况。如果是这样,在盲目删除你的仓库之前,请寻找补充的解决方案。