gpt4 book ai didi

svndumptool 的正则表达式

转载 作者:行者123 更新时间:2023-12-01 19:54:47 25 4
gpt4 key购买 nike

我有一个大型(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com