如何将非结构化SVN文件夹转换为主干/分支样式并保留历史记录?

时间:2010-04-09 21:10:35

标签: svn

我有一个SVN存储库,目前的结构如下:

/versions
  /1.0.0
  /1.0.1
  /1.0.2
  /1.1.0
  /(etc)

这里发生的事情是,当是时候开始新版本时,团队成员会复制以前版本的文件夹并重命名该文件夹;然后将新文件夹添加/提交到SVN。

因此,给定版本文件夹的所有修订历史记录仅限于在该版本文件夹中进行的更改。 SVN认为每个版本文件夹中的每个文件都是在创建版本文件夹时重新创建的。

所以我想做的是将这一系列文件夹转换为传统的trunk / branches / tag SVN结构。

是否有可能以某种方式将每个这些版本化文件夹的修订历史“协调”回一个通用的修订历史记录树?

2 个答案:

答案 0 :(得分:4)

只是为了澄清:当你说他们会添加/提交时,你的意思是他们没有将旧版本的svn副本复制到新版本名称,对吗?基于假设我理解正确...

有可能吗?是的,但没有到位,也不容易。

我接近这个的方法是编写一个脚本,它本质上会按照你想要的方式重放提交,将新的repo转储到svn dumpfile,使用svndumptool.py调整dumpfile,可能还有一些自定义脚本来设置日期和作者等。

你或许可以通过svn来帮助你。试试这种方法:

制作存储库的副本,以便您可以使用它,而不是为其他人制造混乱。然后,在该存储库中,创建/project /project/trunk/project/tags/project/branches目录。结帐项目/主干。使用svn export将1.0.0版本的rev 1升级到trunk工作副本。使用svn log --xml获取原始提交消息,使用svn add添加所有文件并提交。这为您提供了原始起点。

现在,对于对/version/1.0.0的每次提交,将该更改集合并到新的主干中,使用svn log --xml提取提交消息,然后提交。 一旦用完提交到1.0.0,请从svn copytrunk执行tags/1.0.0。然后使用svn merge --ignore-ancestry .../version/1.0.0 .../version/1.0.1@xyz(其中xyz是1.0.1版本的第一个提交)。这应该可以让您在发布过程中发生任何变化。 (你可能需要试验一下才能做到这一点。)

对每个剩余版本重复此过程。

完成上述操作后,您会在/project下拥有一个包含更好历史记录的存储库,但在/versions下仍有旧的丑陋历史记录。要清除它,请使用svn dump project创建仅包含新历史记录的转储文件。现在你将不得不做一些自定义脚本编写,并且可能会自由地使用svndumptool.py来修复dumpfile中的提交时间戳和作者,从svn log --xml输出中提取该信息。您可能需要为发生的标记提交“发明”此信息。

最后,使用svn load将该转储文件导入新的存储库。验证所有新的,辉煌的历史记录是否正常,然后继续使用新的存储库。

(哦,如果你将初始svn mkdir /project /project/trunk /project/tags /project/branches的提交时间戳设置为 1984 ,你就会获得奖励积分。;))

披露:我参与了svndumptool.py

答案 1 :(得分:3)

我一直处于这种状况,如果没有在svn之外进行一些繁重的工作,我不认为你想要做什么。除非您真的需要拥有旧版本的线性历史记录,否则最实际的做法是将这些版本化文件夹移到tags(或者branches)目录下并确保发布从现在开始正确标记。至少你确实拥有从每个版本开始的变化历史。

相关问题