在使用 bazaar(和启动板)几年后,我们计划将FEniCS 项目迁移到 Git。我们对此迁移有一些要求,这使得它相当复杂:
- 我们希望保留历史记录,但对其进行过滤并从历史记录中删除(现在已过时的)文件列表以减小存储库大小。
- 有来自许多独立贡献者的许多特性分支(目前来自 25 个不同人的 76 个分支)。我们想为他们提供一个简单的迁移路径(可由 git 新手完成),以便将他们的分支放入转换和过滤的存储库中。
有一个解决方案1。
我以DOLFIN为例:
导入 bzr 主干:
git init dolfin && cd dolfin
(cd path/to/bzr/trunk; bzr fast-export --plain) | git fast-import
过滤历史:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch ${files_to_strip}" --prune-empty
2也有解决方案。
它需要为上述bzr fast-export
( dolfin.marks.bzr
) 和git fast-import
( dolfin.marks.git
) 步骤导出标记文件。我们可以将这些提供给贡献者,他们可以像这样导入他们的特性分支:
(cd path/to/bzr/branch; bzr fast-export --marks=path/to/dolfin.marks.bzr --git-branch=$(bzr nick)) | \
git fast-import --import-marks=path/to/dolfin.marks.git --export-marks=path/to/dolfin.marks.git
然而,当我们过滤分支时,这个秘诀就失效了,因为这个操作使所有主干提交的 SHA1 哈希无效,因此标记文件也无效。
但是对于 1.和2没有解决方案。
所以问题是:是否有可靠地满足要求 1. 和 2. 的配方?
请注意,理想情况下,这也应该适用于复杂情况,例如已将主干重新合并(甚至多次)的功能分支:应该正确识别来自主干的这些合并的父级(就像它们在 2. 中一样)。