修改SVN分支点

时间:2014-12-06 16:00:14

标签: svn

是否可以重写具有子树分支和来自主干的标签的SVN存储库的历史记录,以便所有分支和标记包含"完成"行李箱的副本?如果是这样,怎么样?

例如:

  branches
    module1-feature1
    module1-feature2
    trunk-branch1
      module1
      module2
      module3
    trunk-branch2
      module1
      module2
  trunk
    module1
    module2
    module3

在上面的示例中,module1-feature1分支仅包含module1的代码。我希望它包含名为module1的文件夹以及文件夹module2(如果创建分支时存在文件夹module3)。分支的名称并不重要,但内容应该是当时主干的完整副本,而不仅仅是创建分支的子文件夹。显然,该分支上的所有更改都将位于文件夹module1中。

1 个答案:

答案 0 :(得分:1)

一旦你知道如何,修改分支点实际上非常简单。但是,您需要SVN转储来执行更改,然后将其加载到新的(或重置)存储库中。

我使用Ubuntu进行此过程,但我不是Linux专家,请原谅我可能出现的错误。

步骤1.获取对SVN存储库的服务器端访问

如果您无法访问SVN仓库的服务器端,则需要创建仓库的本地副本:

 svnadmin create repo_name
 cd repo_name
 cp hooks/pre-revprop-change.tmpl hooks/pre-revprop-change

编辑文件pre-revprop-change,使其始终在最后退出0。

 chmod a+x hooks/pre-revprop-change
 svnsync initialize file:///path/to/repo http://url.to.repo
 svnsync synchronize file:///path/to/repo

步骤2.创建转储文件

svnadmin dump /path/to/repo > repo.dump

步骤3.修改转储(最好先制作副本)

由于SVN中的分支仅涉及提交对原始数据的引用,因此向上移动分支点实际上非常简单(理论上)。在转储文件中的某个时刻,您将拥有以下内容:

Node-path: branches/module1-feature1
Node-action: add
...
Node-copyfrom-path: trunk/module1

将该记录更改为:

Node-path: branches/module1-feature1
Node-action: add
...
Node-copyfrom-path: trunk

是一个好的开始,但现在对该分支的所有后续更改都将是错误的。因此,对branches/module1-feature1树中的文件所做的所有更改都应该在branches/module1-feature1/module1树中。这可以通过在受影响的路径上搜索和替换来完成(我为此使用了sed)。

请注意,如果您有mergeinfo记录,则还应更新这些记录以使分支正确合并。例如:

mergeinfo   
K 13
svn:mergeinfo
V 19
/trunk/module1:2267

应该成为:

mergeinfo   
K 13
svn:mergeinfo
V 11
/trunk:2267

V之后的数字必须等于以下行的长度。搜索和替换并不容易。如果长度错误,则无法导入转储,您将收到错误。

只要您在SVN回购历史中从未犯过任何分支错误,这就是您所需要的。

然而,在实践中,我发现我必须使用三种不同方法的组合。

  1. 手动编辑一些情况,其中分支是以要求我完全删除条目的方式完成的。我使用了emacs,但重要的是使用一个你不相信的编辑器来改变你没有触及过的字节。

  2. svndumpfilter用于删除转储中不相关的内容。 我需要svndumpfilter进行GIT迁移(如果你从一个SVN-repo中创建多个GIT repos,你可以使用svndumpfilter清除与你当前创建的repo无关的东西)。减少转储的大小并使其更易于理解也很有用。另外,我有一些我不再关心的临时分支,也很难纠正。

  3. 如上所述自动搜索和替换。

  4. 步骤4.加载转储文件并检查错误

    使用以下命令创建新的仓库:

    svnadmin create /path/to/repo
    svnadmin load /path/to/repo < repo.dump
    

    检查加载回购时打印的消息,确保其正确无误。我没有找到直接检查新SVN仓库的好方法,但是因为无论如何我要迁移到GIT,这不是我花时间试图解决的问题。

    步骤5.转换为GIT(奖金)

    我使用Atlassian的SVN迁移脚本来获取作者文件(https://bitbucket.org/atlassian/svn-migration-scripts/downloads/svn-migration-scripts.jar)然后我更正了。

    然后使用Subgit完成Git迁移。