如何收缩/削减Git回购

时间:2013-11-21 16:32:31

标签: git branch

我们有一个Git仓库,有7位贡献开发人员,拥有超过2。5年的历史记录和大约10,000次提交。我们使用Assembla推进和拉动。当我们添加新的开发人员时,将repo克隆到他们的dev计算机上需要将近一个小时。

我不确定这是否是正确的术语,但我们的目标是通过“削减/剪断”前1.5年的承诺来“缩小”回购,并保留最新的历史年份。我们希望保留整个仓库的“备份”副本,无论是作为单独的仓库还是分支?我们希望将来重复这一点,可能会在需要时将初始拆分与新拆分合并,但我不确定这是否可行。如果有一种方法可以将所有历史记录保存在一个单独的分支上,并且只保留master分支仅包含去年的历史记录,那就太棒了,但请告诉我可能的优缺点。

我不知道我们拥有的所有可能性/选项,这就是我在这里的原因。我读了一些关于patches的内容,但我不确定这是否真的是我需要的,或者是否有更好/更容易的东西。你们在做什么来照顾这样的问题,包括利弊?请记住,我仍然需要每个开发人员继续推送,最好留在master分支。

提前致谢!

2 个答案:

答案 0 :(得分:7)

可以在Git SCM博客文章"Replace Kicker"上找到最佳分步说明。

简短摘要如下:

  • 创建一个位于您想要剪切的新分支,例如git branch history 哈希
  • 将历史记录推送到新的存储库。
  • 使用git commit-tree创建新基地。
  • 将您的帖子重新定位 - history提交到您的新基地。
  • 将新的截断master分支推送到服务器。
  • 然后,人们可以使用git replace重新连接历史记录。

原帖可以更好地解释图片。

在处理涉及合并的复杂历史时,这可能效果不佳,具体取决于git rebase --onto--preserve-merges的合作程度。显然你应该在继续之前测试好。

答案 1 :(得分:0)

免责声明:您应首先使用测试仓库执行此操作,因为此处列出的命令可能会破坏您的数据

您可以通过快速导出机制编辑(即让脚本编辑)历史记录。第一步是运行git fast-export --signed-tags=strip --no-data --full-tree --export-marks=export.marks branch1 branch2 [...] branchN > commits.fi。现在您拥有所有分支的快速导入流。在此流中,您可以通过删除commit refs / ...到尾部换行符的行来删除提交。您还需要从当时的新“首次”提交中移除from :<mark>行(以及merge :<mark>行(如果您的新历史记录以合并开头)。

为了帮助完成此过程,您应该查看修订图,并在没有合并超过其历史记录的情况下进行修订。在下图中,A,D和F是很好的候选者。 B或C确实存在问题,即后继者D也依赖于G和A.

A ---- B ---- C ---- D --- E ---- F
  \                /  \     \   /
   \--- G ------- H    \--I--J-/

使用export.marks文件,您可以转换提交ID以标记流中的数字。

您需要为您的分支机构提供新名称,因为git fast-import将不接受新历史记录,因为新分支不包含现有分支的提交。

创建新历史记录后,您需要将git fastimport < manipulated-history.fi导入现有仓库。

现在是时候检查导入是否正确了。为此,您需要将repo克隆为临时仓库,并在此临时仓库中为每个新创建的提交创建一个移植,以便它具有与之前相同的父修订。然后你运行git filter-branch newBranch1 newBranch2 [...] newBranchN。如果每个newBranch现在与相应的分支保持相同的提交,则导入是正确的。

当一切工作到目前为止,您可以创建一个新的repo并从第一个工作克隆中拉出newBranch-branches,并使其成为新的工作仓库。另请注意,由于移植物can cause harm

,您不应在任何地方留下任何带有移植物的回购