我需要阅读一些答案和一些其他信息,以了解自己在做什么。
1.忽略所有早于某个提交的内容
该文件.git/info/grafts
可以为提交定义假父母。仅包含提交ID的行表示该提交没有父级。如果我们想说我们只关心最近的2000次提交,则可以键入:
git rev-parse HEAD~2000 > .git/info/grafts
git rev-parse给我们当前提交的第2000个父提交的提交ID。上面的命令将覆盖grafts文件(如果存在)。首先检查它是否在那里。
2.重写Git历史记录(可选)
如果要将这个嫁接的假父母变成真实的父母,请运行:
git filter-branch -- --all
它将更改所有提交ID。此存储库的每个副本都需要强制更新。
3.清理磁盘空间
我没有执行第2步,因为我希望我的副本与上游保持兼容。我只是想节省一些磁盘空间。为了忘记所有旧的提交:
git prune
git gc
选择:浅拷贝
如果您拥有另一个存储库的浅表副本,并且只想节省一些磁盘空间,则可以进行更新.git/shallow
。但是请注意,没有任何东西指向之前的提交。因此,您可以运行以下内容:
git fetch --prune
git rev-parse HEAD~2000 > .git/shallow
git prune
git gc
浅层的入口就像嫁接一样。但是要注意不要同时使用浅层和浅层移植。至少,那里没有相同的条目,它将失败。
如果您仍然有一些指向较旧提交的旧引用(标记,分支,远程头),则它们不会被清理,也不会节省更多的磁盘空间。
git filter-branch --tag-name-filter cat -- --all
更新标签。但是,我还有一些较旧的标签,它们指向我要删除的旧历史记录。如何摆脱所有这些旧标签?如果我不删除它们,那么较早的历史记录不会消失,并且仍然可以通过看到它gitk --all
。