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

Thi*_*ner 26 git size history rebase

我正在使用git开始一个项目,我将提交非常大的文件,但每周只有几次.我已经尝试使用git as-is,它似乎将整个文件存储在每次更改的提交中.这不适用于此项目,存储库将失去控制.所以,我想减少存储库的大小.

我的第一个想法是"简单地"删除所有比两周更早的提交,或者只保留例如历史上的五次提交(这可能更好:) :)我用谷歌搜索并阅读了很多来自The Git社区书籍我猜我会需要使用的git-rebasegit-filter-branch.事情是我似乎无法让它工作.

只是为了说明; 我有一个只有一个分支的历史H(主分支)

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

我想删除一些以前的提交,使我的历史看起来像

C - > D - > E.

提交A和B应该完全清除.我已经尝试了git-rebase但它似乎将提交合并在一起而不是实际删除旧的,也许我不完全理解rebase是如何工作的.另一个想法是从.git/objects中删除所有内容然后使用以下内容构建新提交git-hash-object -w,git-mktree而且git-commit-tree,我还没有设法将这个"人造"树推送到服务器.

我不会与任何分支机构合作,因此不需要考虑这些因素.

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

干杯!


编辑:

大文件不会始终是相同的大文件,有些文件将被新文件替换.我希望这些被替换的文件完全从历史中清除.

alt*_*ive 13

这应该是一个简单的git rebase -i地方

p A
s B
s C
p D
p E
Run Code Online (Sandbox Code Playgroud)

然后编辑AC的提交消息,使其成为C的提交消息.

git-rebase会将所有提交"压缩"到一个提交中,其对象与提交C的对象相同.

注意:git filter-branch如果您愿意,可以使用更改先前提交中的大文件以实际匹配新文件.但这是一次危险的行动,我不想在事故上给你一个糟糕的指挥.

  • 不,你从哪里得到了这个想法?基本上,一旦你压扁其他两个,就提交A _becomes_ commit C. 你可能不得不做一个`git gc`来清除对象. (2认同)
  • 提交A和B消失.就这些.Commit C不会改变. (2认同)