如何将svn:externals转换为git标签

时间:2016-08-31 20:29:38

标签: git svn svn-externals git-tag

我正在努力转换一个相当大小的SVN回购。大约50个项目包括~5种不同的可交付产品(一些项目在所有产品中共享,其他项目仅与几种产品共享,许多项目是特定产品所独有的)。这里有大约15年的代码历史记录(~16K svn修订版)。

在转换为SVN之后,我们使用SVN:externals来标记我们的一些版本。我们的代码结构(结账后在磁盘上)如下:

product1_root
  -> shared_project
  -> project_1
  -> project_2
  -> project_3
product2_root
  -> shared_project
  -> project_4
  -> project_5

SVN中的结构如下(b / t / tr)=标准分支/标签/主干网:

product1_root (b/t/tr)
shared_project (b/t/tr)
project_1 (b/t/tr)
project_2 (b/t/tr)
project_3 (b/t/tr)
product2_root (b/t/tr)
project_4 (b/t/tr)
project_5 (b/t/tr)

使用外部时,在product1_root和product2_root项目上设置外部,分别链接到shared / project2 / 3和shared / project4 / 5,以便它们在磁盘上创建上述结构。因此,在执行发布时,只有product1 / 2_root项目收到标记(SVN外部会自动提取相应版本的子项目)。

我们后来摆脱了外部因素,有利于明确标记所有项目,并使用脚本将它们全部用于构建。

有没有办法在迁移期间将product1_root中的标记传播到project_1,project_2,project_3和shared_project,以便它们与新git仓库中的其余历史记录相匹配。

或者我应该考虑将其作为迁移前或迁移后的任务来解决?

我查看了很多不同的工具,他们似乎都完全忽略了svn:externals,或者尝试将它们转换为子模块。

1 个答案:

答案 0 :(得分:0)

我终于弄明白了。请记住,我的svn:externals设置为指向回购中的特定挂钩(不是头部),所以如果您不在同一条船上,这可能不起作用。

此外,从SVN到git的迁移必须按时间顺序完成,SVN中的修订历史必须按顺序处理。以下两个命令将执行此操作(source)

git svn init [SVN repo url] --stdlayout --prefix=svn/
git svn fetch

这假设您有一个标准的SVN repo布局(branches / tags / trunk)。如果您的不同,则需要修改上述命令。上面的命令也用svn / just作为前缀,以表示这些是从svn导入而不是本机git创建的内容(以备将来参考,以备不时之需)。

一旦完成(从我的16K版SVN回购中抽出一个项目需要大约90分钟)。然后,您可以在SVN仓库中查找svn:externals标记的创建日期,并使用以下命令找到与项目相关的相应git提交:

git log --before='CCYY-MM-DD' -1

输出将采用以下格式:

commit a22182ca563928b4de2143ff98dd0362f9eca36d
Author: <author>
Date:   Wed Oct 31 21:58:01 2012 +0000

<Commit comment>

最后,使用提交哈希的前几个字符并在git中创建标记:

git tag -a v6.1.1.3 a22182 -m "manually creating git tag for svn:externals based tag"

验证git repo和SVN repo中的标记是否相同,然后继续进行转换。