我一直试图通过将一些文件移动到git LFS来减小我的Git存储库的大小。进一步的几百个命令,这里我们使用git LFS中的文件,并且在我的git提交中没有这些文件的历史记录。
但是,每当我克隆存储库时,我仍在下载大约3GB的对象。我通过在Visual Studio Team Services中创建一个新的存储库以及在本地修剪和垃圾收集我的存储库之后解决了这个问题,然后在那里进行推送,它减少到300mb。 (在本文中找到本地命令的命令:Git: what is a dangling commit/blob and where do they come from?)
但是我无法想象你总是要删除/重新创建一个完整的存储库以删除悬空提交。
我还尝试过做一个git init,然后在现有的存储库上推送它,但它只是进一步增加了对象数。
对于遇到类似问题的任何人来说,这些是我在没有悬挂提交时创建新存储库的命令,但我想知道如何在现有存储库中执行此操作而不必删除它:
git clone https://avavedse.visualstudio.com/Test/_git/TestRepository
cd blahblah
git reflog expire --expire=now --all
git gc --prune=now
git remote add newrepo https://avavedse.visualstudio.com/Test/_git/TestRepositoryNewEdition
git push newrepo
答案 0 :(得分:3)
这可能是How to remove a dangling commit from GitHub?
的副本GitHub将定期垃圾收集无法从顶级引用访问的对象。因此,随着时间的流逝,它们会消失。但这不能保证。这是我在此找到的最好的信息。
您可以手动将reflog的到期日期现在更正,然后运行垃圾收集器:
git reflog expire --expire=now --all
git gc --prune=now
但这只会影响本地存储库。
显然,垃圾收集器远非理想之选,除非您不介意删除和创建新的repo并丢失所有问题,拉取请求等,否则您必须联系Github Support:< / p>
您可以永久删除缓存的视图和对 通过联系GitHub支持在GitHub上的请求中获取敏感数据 或GitHub高级支持。[docs.github.com]
答案 1 :(得分:0)
实际上,当您执行git reflog expire --expire=now --all
和git gc --prune=now
时,danglind提交已被删除。您可以git fsck --full
仔细检查。如果输出不显示提交,则表示没有悬空提交。
回购协议大小没有明显减少的另一个原因是你没有删除git历史记录中的LFS文件。您可以通过以下方式重写历史记录:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filename --prune-empty --tag-name-filter cat -- --all
git push -f
有关将文件从git移动到git-lfs的更多细节,您可以参考moving a file in your repository to git-lfs。