3

假设我有一个 Git 存储库,其中包含巨大的树(~60 GiB)和一些历史记录,其中旧版本包含许多已删除的文件。

我现在想修剪旧的历史,但不要 rebase在修剪点之后进行所有提交,因为每次提交都需要几个小时。

  • 我可以只删除第一个要删除的提交对象,并希望git gc删除所有(现在未引用的)旧的吗?还是会因为缺少对象而引起恐慌?

  • 我可以git replace用虚拟提交替换我想要删除的第一个提交,然后调用git gc吗?

  • 还有其他方法可以就地删除我的旧提交吗?

4

1 回答 1

2

无需在修剪点之后重新调整所有提交,因为每次提交都需要几个小时。

这就是嫁接点的用途(在这种特殊情况下比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
于 2017-11-14T19:33:21.727 回答