我曾经问过如何压缩git存储库中的前两次提交。
虽然这些解决方案相当有趣,而且不像git中的其他一些东西那样令人费解,但如果您需要在项目开发过程中多次重复这个过程,那么它们仍然是一个众所周知的伤害。
所以,我宁愿只经历一次痛苦,然后能够永远使用标准的交互式rebase。
那么,我想做的是有一个空的初始提交,它的存在仅仅是为了成为第一个。没有代码,什么都没有。只是占地方,这样就可以做地基了。
我的问题是,有了一个现有的存储库,我如何在第一个提交之前插入一个新的空提交,并将其他所有人向前移动?
我喜欢亚里士多德的答案。但我发现对于大型存储库(>5000次提交),基于以下几个原因,filter-branch比rebase更好
1)它更快
2)当存在合并冲突时,不需要人工干预。
3)它可以重写标签——保存它们。
注意,filter-branch可以工作,因为每次提交的内容都没有问题——它与“rebase”之前完全相同。
我的步骤是:
# first you need a new empty branch; let's call it `newroot`
git symbolic-ref HEAD refs/heads/newroot
git rm --cached -r .
git clean -f -d
# then you apply the same steps
git commit --allow-empty -m 'root commit'
# then use filter-branch to rebase everything on newroot
git filter-branch --parent-filter 'sed "s/^\$/-p <sha of newroot>/"' --tag-name-filter cat master
注意,'——tag-name-filter cat'选项意味着标签将被重写以指向新创建的提交。