我的存储库已经变得太大而无法使用。基本上我的存储库超过2GB,克隆时间太长。我现在想缩小它,但仍然能够回到一些特定的旧版本...... 萎缩将涉及重写历史,所以我很好。有克隆的人将不得不在新的repo clone中的新分支上重新定位/ cherrypick / copyfiles。
我认为这是一个不必要的旧存储库历史记录。到目前为止,我提出的一个可能的过程(我错过了一些步骤,我仍然不确定这会做我认为的):
这是可行的/可行的,没有任何冲突吗? 这可以在任何情况下工作(git commit tree可能相当复杂)? 有没有更好的安全和自动压缩历史的解决方案?
在我看来,这种类型的维护任务会在长期运行的项目中发生,所以我假设其他大型项目已经使用了某种类型的解决方案。但我想可能有一个我不知道的git init(或其他命令)的选项,从旧的repo为这个用例创建一个新的repo?
更新:我在这里找到了解决方案的开头:https://wincent.com/wiki/Editing,_amending,_or_squashing_the_root_commit_in_a_Git_repository 但我想以一种全自动的方式(即没有冲突)多次进入我的历史......
答案 0 :(得分:1)
答案 1 :(得分:1)
好的,经过几天的试用和错误,这是我认为最好的解决方案:
1)从您想要用作新root的提交中,执行checkout --orphan
创建孤立分支,并为此版本提交已更改的文件。
2)对于您要保留的每个提交C,checkout
提交C,reset
到先前的新提交B',提交进行C'新提交,B'作为父提交。 (感谢forvaidya获取链接)
3)您现在需要将现有分支重新链接到您保留的最后一次提交。
在旧历史中查找提交。从那里,列出所有具有它(或其任何一个父)的提交作为直接父。然后,您可以使用新的git replace --graft
将旧的父级替换为新的提交。
为这个提出一个万无一失的脚本是非常有用的......如果我这样做,我会把它发布在这里。
警告:步骤3)仅在您使用git 2.X时有效。 1.X git客户端不会在提交图中看到更改。
答案 2 :(得分:0)
Git浅层克隆是一个答案,但是克隆很浅,你无法推送。
至于壁球有关壁球仅适用于未发表的历史记录,此链接可能有用http://www.awanitech.com/git-squash.html
推送后完成的任何压缩都需要在不同的分支上进行,因为它不是FF推送。这种壁球不会对存储库大小产生影响。
如果你准备做强制推(历史重写);那么你可以做filter-branch并减小尺寸。
如果你的坏版本是完全不同的分支;你可以创建一个git包并将其作为简化的存储库。