如何通过非交互式压缩除最近的提交之外的所有提交来减少膨胀的Git仓库的大小?

san*_*mai 8 git rebase git-rebase git-rewrite-history

我的Git repo有数百GB的数据,比如SQL备份,所以我试图删除旧的,过时的提交,因为它们会使一切变得越来越大.我需要一个快速的解决方案; 越快越好.

除了最新的提交之外,我如何压缩所有提交,而不必在交互式rebase中手动压缩每个提交?具体来说,我不想使用

git rebase -i --root
Run Code Online (Sandbox Code Playgroud)

我的回购

我有这些提交:

A .. B .. C ... ... H .. I .. J .. K .. L
Run Code Online (Sandbox Code Playgroud)

我想是这样的(在两者之间挤压的一切A,并H进入A):

A .. H .. I .. J .. K .. L
Run Code Online (Sandbox Code Playgroud)

有关如何压缩所有提交的答案,但我想保留一些最近的提交.我也不想压缩最近的提交.(特别是我需要保持前两个提交从顶部开始计数.)

M.M*_*M.M 3

原贴评论

如果我们拍摄提交 10004 的快照,删除它之前的所有提交,并使提交 10004 成为根提交,我会没事的

一种方法是在这里,假设您当前的工作称为branchname. 每当我进行大型变基时,我喜欢使用临时标签来仔细检查是否没有更改,并标记一个点,reset如果出现问题我可以返回(不确定这是否是标准程序,但它对我有用) ):

git tag temp

git checkout 10004
git checkout --orphan new_root
git commit -m "set new root 10004"

git rebase --onto new_root 10004 branchname

git diff temp   # verification that it worked with no changes
git tag -d temp
git branch -D new_root
Run Code Online (Sandbox Code Playgroud)

要摆脱旧分支,您需要删除其上的所有标签和分支标签;然后

git prune
git gc
Run Code Online (Sandbox Code Playgroud)

将从您的存储库中清除它。

请注意,您将暂时拥有所有内容的两个副本,直到您拥有gc为止,但这是不可避免的;即使您执行标准的压缩和变基,您仍然拥有所有内容的两个副本,直到变基完成。