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