将 SVN Repositories 内部的下层目录,提高成为顶层 Repositories 的风险

         如何将仓库中的一个目录提高成到顶层,成为顶层的 Repositories? 个人结论是“无通解”、而且有风险!node

例如: 将Repositories6 中 SVN:Repositories6/Rep6_Folder1 目录,提高一级成为一个顶层的 SVN: Rep6_Newes6

网络上传播的方法,通过测试,步骤是这样的:数据库

用svnadmin dump命令导出文件,过滤数据:用 Svndumpfilter 命令过滤出须要的数据;而后直接编辑导出的文件!这一步是有风险的,除非数据库中数据,只有最简单的相互依赖关系。网络

网络上通常给出的编辑文件的方法是,将文件中的这一段文字删除掉,以下:svn

 

Node-path: 将要去掉的目录名工具

Node-kind: dir测试

Node-action: addspa

Prop-content-length: 10版本控制

Content-length: 10日志

 

将文件中全部的:

Node-path: 将要去掉的目录名/

替换成

Node-path: 

 将文件中全部的

Node-copyfrom-path: 将要去掉的目录名/

替换

Node-copyfrom-path: 

备注:若是导出的文件很是大,Windows下编辑超大文件工具,UltraEdit可能都很差用了,能够借用 Linux(Cygwin) 的 sed 或 ed。

如上编辑以后,将编辑过的文件,倒入到新建的Repositories库中 (svnadmin load),成为顶层的库文件。以上就是网传的方法。

然而,Repositories库中数据可能有着更复杂的相互依赖关系,例如:

但愿要提高的目录(也包括文件)可能曾经被修改过名字,甚至删除掉,又重建,你须要仔细查看log,才能知道前因后果,上面说的方法,不必定就那么简单,一蹴而就,一旦搞错了就会混乱不堪。

最可靠的方法,就是损失掉以往的版本信息,导出export干净的Head版本的数据,添加、并提交到(顶层)新库中。原来的下层目录,仍是放在那里好了,不要动它了。

 

 

实验记录:

中止 SVN 服务

 但愿实现:

 Repositories6/Rep6_Folder1 目录提高一级成为一个顶层的Repositories ,New_Rep6(新建立的一个空的Repositories),如图:

导出Repositories

svnadmin dump Repositories6 > DumpRep6

过滤导出文件

Svndumpfilter include Rep6_Folder1 < DumpRep6 > DumpFold1

会发现问题,导出的文件中,没有有用的数据:

E:\Repositories>Svndumpfilter include Rep6_Folder1 < DumpRep6 > DumpFold1
Including prefixes:
'/Rep6_Folder1'

Revision 0 committed as 0.
……
Revision 11 committed as 11.
Revision 12 committed as 12.
svndumpfilter: E200003: Invalid copy source path '/folder1'

缘由是 Rep6_Folder1 是由 folder1 更名而来的(删除&重建)。看日志:

svndumpfilter 命令中使用包含 include 方式是不行的,由于Rep6_Folder1 本来的名字是 floder1(更名过)。这是版本控制的是根,被过滤掉了,Rep6_Folder1就没有根了。改用排除法 exclude 过滤导出:

Svndumpfilter exclude Rep6_Folder2 < DumpRep6  > DumpFold1

Svndumpfilter exclude Rep6_Folder2 < DumpRep6 > DumpFold1
E:\Repositories>Svndumpfilter exclude Rep6_Folder2 < DumpRep6 > DumpFold1
Excluding prefixes:
'/Rep6_Folder2'

Revision 0 committed as 0.
……
Revision 23 committed as 23.

Dropped 7 nodes:
'/Rep6_Folder2'
'/Rep6_Folder2/0sizeFile.txt'
'/Rep6_Folder2/R6F2'
'/Rep6_Folder2/R6F2F1.txt'
'/Rep6_Folder2/R6F2F2.txt'
'/Rep6_Folder2/Rep6_Folder1'

彷佛是OK了,可是仍是有陷阱,若是同一级别的目录还有其它的目录,使用中又被删除掉了,也会一并的导入出来了。(示例中的确如此,见下文。须要仔细查看日志,发现这类问题,能够对过滤出的文件,反复的过滤。)

下一步编辑 DumpFold1 文件 。 将遇到一些棘手的问题。仍是须要仔细查看日志。

而后导入到新建的 Repositories 中:

Svnadmin  load NEW_Rep6 < DumpFold1

导入编辑事后的文件,不必定会成功,导入可能时会遇到一些问题,须要反复几回的编辑修改文件。

例如,可能遇到以下问题:

E:\Repositories>Svnadmin load NEW_Rep6 < DumpFold1
<<< Started new transaction, based on original revision 2
* editing path : Text_BigEndian.txt ...svnadmin: E200014: Checksum mismatch for '/Text_BigEndian.txt':
expected: 9c74ac67638e44e4c8073f608b0655a7
actual: 513155e38d1b941b086234ec289ed6da

这时,你还须要去修改编辑导出的文件,将revision2 的 Text-content-md5:后缀的数字, 修改为上面报告出来的 actual 值。

导入后的截图以下:

 

能够发现, 明显有一个问题 :多出了一个 Rep4_Folder目录。这是一个曾经被添加的目录,而后又删除掉了(有意预留的“炸弹”)。这是编辑处理文件不完善形成了遗留。须要仔细看日志,搞清楚数据之间的逻辑关系,也能够将编辑或过滤掉不须要的文件,能够用 Svndumpfilter 再次过滤一次或屡次。

 

致使上面效果,编辑导出的文件方法附以下:(细节部分,嫌烦忽略)

替换掉folder1/

替换掉Rep6_Folder1/

删除下面一段:

Revision-number: 1
Prop-content-length: 137
Content-length: 137

K 10
svn:author
V 16
VisualSVN Server
K 8
svn:date
V 27
2018-05-25T02:04:35.731309Z
K 7
svn:log
V 25
Created folder 'folder1'.
PROPS-END

Node-path: folder1
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

 

删除下面一段

Node-path: Rep6_Folder1
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 12
Node-copyfrom-path: folder1
Content-length: 0

 

Node-path: folder1
Node-action: delete
Content-length: 0

 

Revision-number: 14
Prop-content-length: 112
Content-length: 112

K 8
svn:date
V 27
2018-06-25T02:37:34.462649Z
K 7
svn:log
V 38
This is an empty revision for padding.
PROPS-END

 

而后按照导入失败的提示修改 Text-content-md5 后面的数字。前文已描述过了。

相关文章
相关标签/搜索