如何使用sed / awk或其他工具来帮助搜索和替换12GB的subversion转储文件

我有一个特殊的情况,我需要在Subversion存储库中删除一系列提交的操作。 (/ trunk / tags / branches)的全部内容被标记,随后在实现错误时被删除。我只是使用svndumpfilter来删除有问题的节点,但有人会在以后重新使用错误的标记名称,因此基于路径的排除将导致其他问题。我需要手动编辑12GB的转储文件。 我有一系列需要编辑的15个顺序修订,它们以下列格式出现在转储中:
Revision-number: 60338
Prop-content-length: 143
Content-length: 143

K 7
svn:log
V 41
Tagging test prior to creating xx branch
K 10
svn:author
V 7
userx
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END

Node-path: test/tags/XX_8_0_FINAL
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 60337
Node-copyfrom-path: test
基于我已经完成的测试,我知道我需要将上面的部分更改为以下内容
Revision-number: 60338
Prop-content-length: 112
Content-length: 112

K 7
svn:log
V 38
This is an empty revision for padding.
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END
还有14个修订版需要进行相同的更换。 尝试在VIM中手动编辑文件是非常不切实际的。转储文件是二进制文件和ascii文本的混合。 如果有人有任何可以帮助我的awk / sed魔法,我会非常感激。     
已邀请:
首先是一个很大的警告:sed和awk旨在处理纯文本文件。如果你的文件是二进制文件和ascii的混合,那么我不相信以下内容可行(个人我会使用Perl)。 我假设“修订版号:60338”是您想要用作触发器的东西(天堂会帮助您,如果它出现在二进制文件中)。将修改后的部分(“......这是一个空修订版本......”)放在一个名为
newsection
的单独文件中。然后:
sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename
    
SvnDumpTool怎么样?您可以使用逐步转储的已编辑部件加入最初的“好”部分。     
我最终使用了以下步骤:
cat dump.file | grep -C 250 "Revision-number: xxxxx"
这给了我“坏”提交的节点操作文件中的确切行号。 然后我使用sed删除每个提交的节点操作范围(按行号),如下所示:
sed -e "123,456d" -e "234,456d"
事实证明这很快。 对于那些好奇的人,我需要完全删除它们的原因是因为我们的存储库扫描程序(Atlassian Fisheye)需要花费数天来索引错误的提交。我使用的排除规则应该解决这个问题,但事实证明我发现了一个排除规则的错误,该规则将在下一版Fisheye中修复。 看到: http://jira.atlassian.com/browse/FE-2752     
这些提交是否包含机密材料或删除它们的原因是什么?为什么不让它们在存储库中删除标签/分支,就是这样。编辑:监督你已经删除了标签/分支......     

要回复问题请先登录注册