是否可以重写具有子树分支和来自主干的标签的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中。
答案 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回购历史中从未犯过任何分支错误,这就是您所需要的。
然而,在实践中,我发现我必须使用三种不同方法的组合。
手动编辑一些情况,其中分支是以要求我完全删除条目的方式完成的。我使用了emacs,但重要的是使用一个你不相信的编辑器来改变你没有触及过的字节。
svndumpfilter用于删除转储中不相关的内容。 我需要svndumpfilter进行GIT迁移(如果你从一个SVN-repo中创建多个GIT repos,你可以使用svndumpfilter清除与你当前创建的repo无关的东西)。减少转储的大小并使其更易于理解也很有用。另外,我有一些我不再关心的临时分支,也很难纠正。
如上所述自动搜索和替换。
步骤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迁移。