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

Svn 如何使用sed/awk或其他工具帮助搜索和替换12GB subversion转储文件,svn,sed,awk,svndumpfilter,Svn,Sed,Awk,Svndumpfilter,我遇到了一种特殊情况,需要删除Subversion存储库中一系列提交操作。对(/trunk/tags/branchs)的全部内容进行了标记,并在发现错误后将其删除。我只是简单地使用svndumpfilter来删除有问题的节点,但是有人在以后重新使用了错误的标记名,因此基于路径的排除将导致其他问题。我需要手动编辑12GB的转储文件。 我有一系列需要编辑的15个连续修订,它们以以下格式出现在转储中: Revision-number: 60338 Prop-content-length: 143 Co

我遇到了一种特殊情况,需要删除Subversion存储库中一系列提交操作。对(/trunk/tags/branchs)的全部内容进行了标记,并在发现错误后将其删除。我只是简单地使用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

首先需要注意的是:sed和awk设计用于纯文本文件。如果您的文件是二进制文件和ascii文件的混合体,那么我不相信下面的方法会起作用(我个人会使用Perl)

我假设“修订号:60338”是您想要用作触发器的(如果它出现在二进制文件中,上天会帮助您)。将修订的部分(“…这是一个空修订…”)放在一个单独的文件中,例如,
newsection
。然后:

sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename

怎么样?您可以将初始的“良好”部分与增量转储的编辑部分连接起来。

如何?您可以将初始的“良好”部分与增量转储的编辑部分连接起来。

我最后使用了以下步骤:

cat dump.file | grep -C 250 "Revision-number: xxxxx"
这为我提供了“错误”提交的节点操作文件中的确切行号。 然后,我使用sed删除每个提交的节点操作范围(按行号),如下所示:

sed -e "123,456d" -e "234,456d"
这证明是相当快的。 对于那些好奇的人,我需要完全删除这些内容的原因是因为我们的存储库扫描程序(Atlassian Fisheye)花费了数天的时间来索引错误提交。我当时使用的排除规则应该能够解决这个问题,但后来我发现了一个带有排除规则的bug,该bug将在Fisheye的下一个版本中修复。 见:

我最后使用了以下步骤:

cat dump.file | grep -C 250 "Revision-number: xxxxx"
这为我提供了“错误”提交的节点操作文件中的确切行号。 然后,我使用sed删除每个提交的节点操作范围(按行号),如下所示:

sed -e "123,456d" -e "234,456d"
这证明是相当快的。 对于那些好奇的人,我需要完全删除这些内容的原因是因为我们的存储库扫描程序(Atlassian Fisheye)花费了数天的时间来索引错误提交。我当时使用的排除规则应该能够解决这个问题,但后来我发现了一个带有排除规则的bug,该bug将在Fisheye的下一个版本中修复。 见: