完全从历史记录中删除(旧的)git提交

29

我正在使用Git启动一个项目,需要提交很大的文件,但每周只提交几次。我尝试使用原始Git进行操作,但似乎每次更改都会在提交中存储整个文件,这对于这个项目来说行不通,存储库会失控。因此,我想缩小存储库的大小。

我的第一个想法是“简单地”删除所有早于两周的提交,或仅保留历史记录中的前五个提交(这可能更好:))。我已经从Git社区书籍中谷歌并阅读了很多内容,我想我需要使用 git-rebasegit-filter-branch 来完成。问题是,我似乎无法让它工作。

为了说明,我有一个仅有一个分支(主分支)的历史 H:

A --> B --> C --> D --> E

我想要删除一些先前的提交,使历史记录如下所示:

C --> D --> E

提交 A 和 B 应该被完全清除。我尝试过使用 git-rebase,但它似乎只是合并提交而不是实际删除旧的提交,也许我没有完全理解重置的工作原理... 我还想到另一种方法,即从 .git/objects 中删除所有内容,然后使用 git-hash-object -wgit-mktreegit-commit-tree建立一个新的提交,但我还没有成功将这个“人造”树推送到服务器上。

我不会使用任何分支,因此无需考虑它们。

我想知道是否有人可以给我提供 git-rebase 的具体用法,如果这是我应该使用的工具?或者其他提示、示例、我可以做些什么。

谢谢!


编辑:

大文件不会一直是同一个大文件,有些文件将被新文件替换。我希望这些被替换的文件能够完全清除历史记录。


后续的提交(从C开始)是否仍然包含大文件,还是它们已经在之前被删除(git rm)了? - Paŭlo Ebermann
你用“合并”这个词来描述“git-rebase”,让我觉得你可能并不真正理解“git-rebase”。git-rebase会移动提交并将它们应用于不同的头部,或者如果你传递了-i参数,它会让你重写和“压缩”提交,改变顺序,执行命令,编辑提交消息等。没有涉及到合并。 - alternative
4
git是否适合这个工作?如果你只想保留最近的几个快照,那不是打了自己的脸吗?为什么不使用平面文件存储呢? - Robie Basak
1个回答

14

这应该是一个简单的 git rebase -i,你需要

p A
s B
s C
p D
p E

然后编辑提交信息,将A-C的提交信息仅保留为C的提交信息。

git-rebase将所有提交合并成一个单独的提交,其对象与提交C的对象相同。

注意:如果你愿意,可以使用git filter-branch将之前的提交中的大文件实际匹配到新的文件上。但这是一项危险的操作,我不想意外给你错误的命令。


2
不,你从哪里得到这个想法的?基本上,一旦你将另外两个提交压缩在其上,提交A就变成了提交C。但是你可能需要执行git gc来清除对象。 - alternative
2
提交 A 和 B 消失了。就这样。提交 C 没有改变。 - alternative
提交 A 肯定不会消失。压缩不会从历史记录中删除任何内容,除了相关的提交消息,而不是提交的内容。 - Chris Rasys
@Chris 旧提交对象和blob已不再必要,并应在下次修剪时删除。提交消息是提交的一部分,旧树已不再链接 - 它是流浪的。 - alternative
是的,我知道所有这些,我的意思是提交 A 的原始内容仍将存在,而不是被删除/销毁。 - Chris Rasys
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接