例子
所以假设我有一个本地 git repo,有 10 个提交,SHA 摘要为 0-9,所以我的 git 日志看起来像这样
9 (HEAD -> master)
8
7
6
5
4
3
2
1
0 <- initial commit
我决定提交 5-9 是垃圾,我想从存储库和他们引入的磁盘空间中永久删除它们的所有记录。Baiscally,我希望我的 repo 的状态与提交 4 时的状态相同,并且就像 5-9 从未发生过一样。
我知道这git reset --hard 4
会使我的 repo似乎已经倒退到提交 4,但据我了解,这只是将提交master
点从 9 更改为 4,但实际上并没有删除任何内容。所有数据仍然存在,如果您知道提交 9 的 SHA,则可以恢复。
我也知道,git filter-branch
但这只会从历史记录中删除文件,而不是提交。
我试过做:
git reset --hard 4
git gc --prune=now
但是这样做之后,我的.git
目录的磁盘空间使用量相同或更大,我仍然可以恢复历史记录git checkout 9
。为什么不git gc --prune=now
修剪提交 5-9?我需要过期reflog
吗?
更普遍:
如果我有一个包含许多分支、标签、提交、合并和不同历史记录的复杂存储库,我如何才能永久自动删除所有提交,以及它们引入的更改以及它们消耗的磁盘空间,这些都是在一段时间后发生的。有效地将整个 repo 倒回到那个时间,并永久销毁该日期之后发生的所有活动。