2

我有一个非常大的存储库,只有一个分支。它的工作树不断更新(每隔几秒)和提交(每隔几分钟)。

我的实际目标是git subtree split针对特定目录运行并在将该目录移动到保存位置后截断大部分存储库。(请参阅将子目录分离(移动)到单独的 Git 存储库)但是,这会失败,因为其中一个提交有一个空的ident.

因此,我继续尝试删除此提交。但到目前为止,我发现的唯一方法是rebase. 但是,这不仅会在我的存储库上花费很长时间,而且我需要在此过程中停止对工作树的不断更新,这可能是不可能的或不理想的。

鉴于(我对提交在内部表示的方式的理解),我认为只需从历史中消除提交并切换相邻提交的链接将是一件简单的事情。不过,我想subtree split使用一个空的ident..提交应该会更容易。

编辑

好的,我最近意识到我可以git replace --edit <ref>用来更改相关提交上的标识。但是,我也意识到过去 1000 次提交的标识为空。我应该写一个脚本来改变它们,还是可以subtree split解决这个问题?

编辑

好的,所以我已经设法使用 更改了所有作者/提交者的姓名和电子邮件filter-branch --env-filter,然后创建了一个嫁接并成功地切断了链接问题中描述的旧提交。但是,我的存储库大小仍然相同——如何删除旧提交占用的额外空间?

编辑

我尝试了在 SO 和其他地方找到的几种方法。

  • git gc --aggressive --prune=now失败了
错误:无法读取 2cbe0846930116a0eff259abbf2caab74737b379                                                
致命:无法遍历提交 cc7349dcde96404a767afaf07da3186c7f31e540 的父母                            
错误:无法运行重新打包
  • git prune是成功的,但并没有减少存储库的大小。(230G到205G左右)
  • git update-ref -d在上述错误中的两个哈希上并不能解决问题
  • 关于我想保留的分支,由于内存限制,我不能bundle或来自其他地方。pull否则,我会这样做并删除此存储库。
  • git fsck产生以下结果:
提交 c9ce63c35025b0cc7396144f4f070b9b0f56fb19 中的错误:无效的作者/提交者行 - 电子邮件前缺少空格
检查对象目录:100% (256/256),完成。
检查对象:100% (11760/11760),完成。
检查连接性:163203,完成。
悬空提交 6b3b3062c0df601c8e186400d7a8fc1bf67d28b9
悬空提交 a451609287a38162c70f42aeab8a0a84bb2d72dd
悬空提交 13bdd914dcf58dfd6565415884d03b6d8a69b6d5
悬空提交 d8137a92199ca75bb6098d28f20a6f52dfb33b7b
悬空提交 6ca49a78de5fb4dd381c210e28c23e5600470042
悬空提交 703c6b102f9398897db6b82a0eea57440f979e1f
悬空提交 0f15744cc9dd1751dc38d3045113cf53c9936058
悬空提交 2e209c2f159766adf143d0b9a50717977d20df3f
悬空提交 6b8d3538efa1b5714f33ee95a5aa953dfd0a7b0a
悬空提交 9cdcc59c28d4b60ed82dd20eae1466e959f9aaac
悬空提交 41f68584ab5c5bc8e97dd1951fff8465d5b3c46c
悬空提交 d30be628e980388a653672cc6fed916d55a4d954
悬空提交 a4b2dee6464c245fe2b1d22dd51e5da92bd395dd
悬空提交 5a0b5f30eabe447ed5c7b29685145c716be79d97
悬空提交 401daf96420733905dd281cca3b127f11924d97b
悬空提交 c184571e9bdb0792143a2fa976c966fc60e92280

graft基本上,我需要一种方法来截断我用and销毁的提交中剩余的任何内容filter-branch。真的,我的首要任务是保持上述其他分支和工作目录完好无损。如果有必要,我可以摧毁其他一切。

4

0 回答 0