我们有一个Git仓库,有7位贡献开发人员,拥有超过2。5年的历史记录和大约10,000次提交。我们使用Assembla推进和拉动。当我们添加新的开发人员时,将repo克隆到他们的dev计算机上需要将近一个小时。
我不确定这是否是正确的术语,但我们的目标是通过“削减/剪断”前1.5年的承诺来“缩小”回购,并保留最新的历史年份。我们希望保留整个仓库的“备份”副本,无论是作为单独的仓库还是分支?我们希望将来重复这一点,可能会在需要时将初始拆分与新拆分合并,但我不确定这是否可行。如果有一种方法可以将所有历史记录保存在一个单独的分支上,并且只保留master
分支仅包含去年的历史记录,那就太棒了,但请告诉我可能的优缺点。
我不知道我们拥有的所有可能性/选项,这就是我在这里的原因。我读了一些关于patches
的内容,但我不确定这是否真的是我需要的,或者是否有更好/更容易的东西。你们在做什么来照顾这样的问题,包括利弊?请记住,我仍然需要每个开发人员继续推送,最好留在master
分支。
提前致谢!
答案 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。
,您不应在任何地方留下任何带有移植物的回购