如何将具有多个分支的大型bzr项目迁移到git和过滤历史记录

时间:2013-03-27 13:47:44

标签: git version-control filter migration bazaar

使用集市(和launchpad)几年后,我们计划将FEniCS project迁移到Git。我们对此迁移有一些要求,这使得它相当复杂:

  1. 我们希望保留历史记录,但过滤它并从历史记录中删除(现在已过时)文件列表以降低存储库大小。
  2. 来自许多独立贡献者的many个功能分支(目前来自25个不同的人的76个分支)。我们希望为他们提供一个简单的迁移路径(可由git新手使用),以便将他们的brances放入已转换和过滤的存储库中。
  3. 有1个解决方案。

    我以DOLFIN为例:

    导入bzr trunk:

    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还有a solution

    它需要导出上述bzr fast-exportdolfin.marks.bzr)和git fast-importdolfin.marks.git)步骤的标记文件。我们可以把它们提供给贡献者s.t.他们可以像这样导入他们的功能分支:

    (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中)。 )。

1 个答案:

答案 0 :(得分:0)

不幸的是,目前使用标记文件无法为1和2执行此操作。

如果忽略标记文件(只是不生成它们),让用户进行完全转换并确保对所有用户一致地进行过滤,那么你应该得到相同的SHA1,因此相同的共同历史记录到处。