假设我有一个 Git 存储库,其中包含巨大的树(~60 GiB)和一些历史记录,其中旧版本包含许多已删除的文件。
我现在想修剪旧的历史,但不要 rebase
在修剪点之后进行所有提交,因为每次提交都需要几个小时。
我可以只删除第一个要删除的提交对象,并希望
git gc
删除所有(现在未引用的)旧的吗?还是会因为缺少对象而引起恐慌?我可以
git replace
用虚拟提交替换我想要删除的第一个提交,然后调用git gc
吗?还有其他方法可以就地删除我的旧提交吗?
假设我有一个 Git 存储库,其中包含巨大的树(~60 GiB)和一些历史记录,其中旧版本包含许多已删除的文件。
我现在想修剪旧的历史,但不要 rebase
在修剪点之后进行所有提交,因为每次提交都需要几个小时。
我可以只删除第一个要删除的提交对象,并希望git gc
删除所有(现在未引用的)旧的吗?还是会因为缺少对象而引起恐慌?
我可以git replace
用虚拟提交替换我想要删除的第一个提交,然后调用git gc
吗?
还有其他方法可以就地删除我的旧提交吗?
无需在修剪点之后重新调整所有提交,因为每次提交都需要几个小时。
这就是嫁接点的用途(在这种特殊情况下比git replace
我在此处详述的要好)
只有一行带有提交 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