svndumptool 的正则表达式

标签 regex svn migration repository svn-externals

我有一个大型(30+GB)旧版 SVN 存储库,其中定义了许多需要克隆到新服务器的外部内容。由于该存储库最初是在 SVN v1.5 之前创建的,因此它有许多使用引用旧服务器名称的绝对路径定义的外部。我想删除所有绝对路径并将它们设置为相对路径,以便迁移能够正常进行。

我找到了svndumptool通过这个question ,它在某些外部情况下效果很好,但我无法找出适用于其余情况的正则表达式。

以下是我通过运行命令在存储库中找到的六种不同类型的外部定义的情况:svn propget --recursive svn:externals %REPODIR_FILE%/%REPO%

CaseA https://svn.acme.com/svn/test/branches/project.x
CaseB -r 19 https://svn.acme.com/svn/test/branches/project.y
https://svn.acme.com/svn/test/branches/project.z CaseC
-r 20 https://svn.acme.com/svn/test/branches/project.z@20 CaseD
CaseE  https://svn.acme.com/svn/test/branches/project.x CaseE
CaseF -r21  https://svn.acme.com/svn/test/branches/project.y

请注意,CaseE 与 CaseA 相同,只是 https 之前有双倍空格。

请注意,CaseF 与 CaseB 几乎相同,除了 -r 和标记号之间的空格以及 https 之前的双倍空格之外。

我正在使用rubular.com为了测试我的正则表达式,目前我正在使用以下表达式:

^(\S+) (|-r ?\d* ?)https:\/\/svn.acme.com(\S+)

这给了我:

Match 1
1.  CaseA
2.   
3.  /svn/test/branches/project.x
Match 2
1.  CaseB
2.  -r 19
3.  /svn/test/branches/project.y

我无法想出一个 REGEX 可以将案例 C 和 D 解析为如下所示:

Match 3
1.  /svn/test/branches/project.z
2.  
3.  CaseC
Match 4
1.  -r 20
2.  /svn/test/branches/project.z@20
3.  CaseD

svndumptool 似乎确实要求我拆分外部定义的不同组件,以便它能够以正确的(SVN v1.5)语法正确地重新组装它。

任何来自正则表达式大神的帮助将不胜感激:-)

最佳答案

这是我发现对我有用的一组命令,希望这对将来尝试修复 SVN 存储库的人有所帮助。记住 friend 不要让 friend 使用绝对的外部!

此过程在前六次迭代中将外部列表从超过 30K 定义的外部减少到仅 30 个定义的外部。

:: List of types of externals we need to deal with
CaseA https://svn.acme.com/svn/test/branches/project.x
CaseB -r 19 https://svn.acme.com/svn/test/branches/project.y
https://svn.acme.com/svn/test/branches/project.z CaseC
-r 20 https://svn.acme.com/svn/test/branches/project.z@20 CaseD
CaseE  https://svn.acme.com/svn/test/branches/project.x
CaseF -r21  https://svn.acme.com/svn/test/branches/project.y

:: SVN Dump Tool
SET SVNDUMPTOOL=C:\support\svndumptool\v0.6.1\svndumptool.exe
SET REPODIR=D:\Repositories
SET REPODIR_FILE=file:///D:/Repositories
SET DUMPDIR=D:\Dumps
SET REPO=test
SET SVN="C:\Program Files (x86)\VisualSVN Server\bin\svn.exe"
SET SVNADMIN="C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"
SET CREATE=%SVNADMIN% create
SET LOAD=%SVNADMIN% load --ignore-uuid
SET DUMP=%SVNADMIN% dump

:: Get a list of the externals in the original repo
svn propget --recursive svn:externals %REPODIR_FILE%/%REPO%>%DUMPDIR%\%REPO%.externals

:: Dump the repo
%DUMP% %REPODIR%\%REPO% > %DUMPDIR%\%REPO%.dump

:: Transform the repo
:: CaseA
%SVNDUMPTOOL% transform-prop svn:externals "^(\S+) https://svn.acme.com(\S+)" "\2 \1" %DUMPDIR%\%REPO%.dump %DUMPDIR%\%REPO%_A.dump
:: Delete the dump to save disk space, each dump file iteration is ~300GB
DEL %DUMPDIR%\%REPO%.dump
:: CaseB
%SVNDUMPTOOL% transform-prop svn:externals "^(\S+) (-r ?\d* ?)https://svn.acme.com(\S+)" "\2\3 \1" %DUMPDIR%\%REPO%_A.dump %DUMPDIR%\%REPO%_AB.dump
DEL %DUMPDIR%\%REPO%_A.dump
:: CaseC
%SVNDUMPTOOL% transform-prop svn:externals "^(\S*)https://svn.acme.com(\S*)" "\2\1" %DUMPDIR%\%REPO%_AB.dump %DUMPDIR%\%REPO%_ABC.dump
DEL %DUMPDIR%\%REPO%_AB.dump
:: CaseD
%SVNDUMPTOOL% transform-prop svn:externals "^(-r ?\d* ?)(\S+) https://svn.acme.com(\S+)" "\1\2 \3" %DUMPDIR%\%REPO%_ABC.dump %DUMPDIR%\%REPO%_ABCD.dump
DEL %DUMPDIR%\%REPO%_ABC.dump
:: CaseE
%SVNDUMPTOOL% transform-prop svn:externals "^(\S+)  https://svn.acme.com(\S+)" "\2 \1" %DUMPDIR%\%REPO%_ABCD.dump %DUMPDIR%\%REPO%_ABCDE.dump
DEL %DUMPDIR%\%REPO%_ABCD.dump
:: CaseF
%SVNDUMPTOOL% transform-prop svn:externals "^(\S+) (-r ?\d* ?)  https://svn.acme.com(\S+)" "\2\3 \1" %DUMPDIR%\%REPO%_ABCDE.dump %DUMPDIR%\%REPO%_ABCDEF.dump
DEL %DUMPDIR%\%REPO%_ABCDE.dump

:: Delete the old repo
RMDIR /Q /S %REPODIR%\%REPO%
:: Create a new clean repo
%CREATE% %REPODIR%\%REPO%
:: Load the fixed dump
%LOAD% %REPODIR%\%REPO% < %DUMPDIR%\%REPO%_ABCDEF.dump
:: Get the new list of externals
%SVN% propget --recursive svn:externals %REPODIR_FILE%/%REPO%>%DUMPDIR%\%REPO%_ABCDEF.externals

关于svndumptool 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21292688/

相关文章:

ios - 使用私钥/公钥的 SVN 存储库的 Xcode 4 版本控制

svn - 如何在Mercurial中提取变更集的所有变更文件?

php - 使用 ENGINE 子句在迁移中创建表失败

javascript - 从 JS 迁移,tsc 构建中的错误

python - 如何从字符串末尾提取数字

javascript - Javascript 中十进制输入的正则表达式,小数点前有 1 到 3 位数字,小数点后有 1 到 3 位数字

bash - 在 bash 中使用 awk/cut 剥离空间并获取值

regex - Grep Regex 匹配任何内容,包括换行符

java - 多个字符实例的正则表达式

postgresql - Yii2 迁移不适用于 Heroku