将具有重命名trunk历史记录的SVN repo导入Git

5
我正在尝试将Subversion存储库转换为Git。我面临的问题是如何保留完整的历史记录。SVN存储库具有相当复杂的历史记录,而git-svn仅从特定版本开始工作,忽略了所有更早的历史记录。
更多细节:我想导入一个项目,该项目现在位于std-layout http://svn.../projects/myProject/trunk。然而,trunk在SVN中并不像现在这样被创建。它最初是作为一些自定义路径(如/my_project)创建的,然后在SVN中重命名为myProject/trunk,然后进行了几次移动和重命名,最终以标准布局结束。
因此,如果我只是导入指向我需要的SVN项目文件夹的存储库,则git-svn结果将从引入标准布局的修订版本开始历史记录,而忽略了projects/myProject/trunk在存储库中早期多次移动的事实。
从技术上讲,如果要将来自同一存储库的其他位置(在主干之外)的SVN文件夹的历史记录移动/复制到主干中,则需要导入历史记录。
是否有人有任何恢复此类存储库历史记录的想法?也许可以使用多个导入,然后进行git接枝,或者其他一些魔术?是否有任何简单的方法?

1
这个回答是否不够完整?如果是,哪里不够完整? - Patrick Quirk
可能是Git-svn - import full history的重复问题。 - 1615903
可能是我做错了什么,但它对我不起作用。链接的答案假定一个项目定义了分支和标签的结构,我的项目已经多次更改了结构。因此,git不会跟随当前布局引入之前的历史记录。 - kan
2个回答

0

reposurgeon,成功转换了一些复杂的旧 SVN 仓库,可能可以处理这个。请参阅其手册页面,特别是“使用 Subversion”部分。

从文档中看来,branchify选项应该包含您的主干路径列表:

以下是将子目录映射到Subversion存储库中的分支所使用的规则:
1. 在任何时候,有一组声明潜在分支的可选路径和路径通配符。有关如何更改此集合的信息,请参见`branchify`选项的文档,初始集合包括{trunk,tags / *,branches / * 和'*'}。
...
4. 如果分支集合的一个元素以*结尾,则将其每个直接子目录视为潜在分支。如果`*`在分支集合中(默认为真),则除了/ trunk、/ tags和/ branches之外的所有顶级目录也被认为是潜在分支。
指定要作为潜在分支处理的目录列表(如果在创建副本后没有修改,则成为标记)当分析Subversion仓库时,使用`branchify` [`path-set`]。
在使用`--nobranch`读取选项时,将忽略此列表。它默认为“标准布局”目录集,以及存储库根目录中的任何未识别目录。

branchify选项的默认值包含*,这可能已经为您检测到旧分支。如果没有,您可以尝试将branchify设置为包含my_projectmyProject/trunktrunk,以及默认路径tags/*branches/*

这样做后,您可能会得到多个Git分支——一个用于my_project,一个用于trunk等等。如果发生这种情况,reposurgeon的unitegraft命令也许能够将它们合并;我不确定。如果这些命令只适用于存储库而不是分支,您可以创建一个Git嫁接,并按照this answer中所述运行git filter-branch


0

我也遇到了同样的问题,而且我已经苦苦挣扎了很久。 最终,在this question的启发下,我总结了以下步骤来实现目标。

  1. 使用初始布局克隆svn-root-directory
  2. git svn reset -r <revision that add layout folders>
  3. /.git/config中,将remote.svn.fetch/branches/tags设置为相应的布局
  4. git svn fetch -r <revisions in this layout, A:B(included) > [--ignore- path=branches\/](需要提前删除同名的远程分支引用(如果有),否则它会跳过分支步骤)
  5. 如果还有更多的布局更改,请重复上述2个步骤
  6. 检查所有分支历史记录是否正确gitk -- all

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接