假设我有一个包含大树(~60 GiB)的Git存储库和一些历史记录,其中旧版本包含许多已删除的文件。
我现在想要修剪旧历史,但没有 rebase
修剪点之后的所有提交,因为每次提交需要几个小时
我可以删除要删除的第一个提交对象,并希望git gc
删除所有(现在未引用的)旧提交对象吗?或者这会因为缺少物体而导致恐慌吗?
我可以使用git replace
替换我想要使用虚拟提交删除的第一个提交,然后调用git gc
吗?
是否有其他方法可以就地删除我的旧提交?
答案 0 :(得分:2)
没有在剪枝点之后重新设置所有提交,因为每次提交需要几个小时。
这就是graft point的用途(在特定情况下比git replace
更好,因为我detail here)
只有一行带有提交ID的文件.git/info/grafts
表示提交没有父级。
要保留最近100次提交,请使用git rev-parse
:
git rev-parse HEAD~100 > .git/info/grafts
然后:
git filter-branch -- --all
最后:
rm -Rf .git/refs/original
然后你可以修剪其余部分:
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
git repack -Ad # kills in-pack garbage
git prune # kills loose garbage