恐怕我找不到任何类似的场景。
我有一个有很多历史的git存储库:500多个分支,500多个标签,可以追溯到2007年年中。它包含大约19,500个提交。我们希望删除2010年1月1日之前的所有历史记录,使其更小,更容易处理(我们将在存档存储库中保留历史记录的完整副本)。
我知道我想要成为新存储库根的提交。然而,我不能找出正确的git mojo来截断回购以提交开始。我猜是某种变体
git filter-branch
涉及到移植是必要的;可能还需要分别处理我们想要保留的200多个分支中的每个分支,然后将回购补丁重新组合在一起(我确实知道如何做)。
有人做过这样的事吗?我有git 1.7.2.3,如果这很重要的话。
这里有太多不是当前的答案,有些并不能完全解释后果。下面是我使用最新的git 2.26来精简历史的方法:
首先创建一个虚拟提交。此提交将作为截断后的repo中的第一个提交出现。您需要这样做是因为此提交将保存您所保存的历史记录的所有基础文件。SHA是要保留的提交的上一个提交的ID(在本例中为8365366)。字符串'Initial'将作为第一次提交的提交消息显示。如果您使用的是Windows,请从Git Bash命令提示符中输入以下命令。
# 8365366 is id of parent commit after which you want to preserve history
echo 'Initial' | git commit-tree 8365366^{tree}
上面的命令将打印SHA,例如d10f7503bc1ec9d367da15b540887730db862023。
现在只需输入:
# d10f750 is commit ID from previous command
git rebase --onto d10f750 8365366
这将首先将提交8365366的所有文件放到虚拟提交d10f750中。然后它将在d10f750顶部播放8365366之后的所有提交。最后,主分支指针将被更新到最后一次提交回放。
如果你想推这些截断的repo,只需执行git push -f。
有几件事要记住(这些适用于其他方法以及这个方法):标签不会被传输。虽然提交id和时间戳被保留,但你会看到GitHub在汇总标题中显示这些提交,比如在XY日期上的提交。
幸运的是,它是可能保持截断历史作为“存档”,以后你可以加入回切回购与存档回购。要做到这一点,请参阅本指南。