从存储库中删除旧版本修订中的单个文件

从存储库中删除旧版本修订中的单个文件

我们对 Subversion 存储库的政策相当严格,这也带来了很大的不便。对于我们的分支,任何签入 Subversion 的内容都必须具有经过编辑的身份验证凭据(例如数据库、用户帐户等)。已添加并提交一个文件,其中包含名称和密码。此 xml 文件有三个修订版本:

第一的- 文件已添加并提交,其中包含一些与该问题无关的内容。
第二- 文件(以及其他 3 个不相关文件)已使用身份验证凭据作为全新 XML 块的一部分提交。
第三- 添加并签入了更多文件,但没有一个是上次修订版中坏文件的较新版本。
第四- 再次签入单个损坏文件,并删除了身份验证凭据(具体而言,没有其他内容)。

我想删除第二个修订版本,这是第一次发生这种情况,我以前从未处理过这种情况。我知道使用 Subversion 很难,因为软件的目的是维护代码修订版本,而不是挑选和更改旧修订版本。是否可以从以前的修订版本中删除一个文件,或者用较新修订版本的内容覆盖它(即用第四个修订版本的文件替换第二个修订版本的坏文件)?

答案1

Subversion目前没有obliterate此功能。它曾多次被讨论过,但它扰乱了存储库的完整性,并且尚未实施

警告:该链接包含了 11 年的讨论svn obliterate

解决方法是使用svnadmin dump(关联),然后使用svndumpfilter关联)阻止将特定修订添加到恢复的存储库。

答案2

你可以通过一些创造性的转储文件编辑来实现这一点。首先,你需要使用

svnadmin dump repolocation > file.dump

您需要在文本编辑器中打开 file.dump 文件并找到文件添加的修订版本。查找 Revision-number: xxx,其中 xxx 是第二个文件添加的修订版本。在其下方,您将找到如下块:

Node-path: trunk/my/file1.txt
Node-kind: file
Node-action: change
Text-content-length: 14
Text-content-md5: c0bf20e1c2a520acddd3fccc2b9c5781
Text-content-sha1: 83162b1f0ca7b6e6816d2bc8f44550915fa2f4b7
Content-length: 14

contentsinfile

如果删除上述块,转储文件仍然有效,并且当您将转储文件加载到新存储库时,就像第二个文件从未添加到存储库一样

但是如果您必须显示该文件(因为它可能包含一些其他修改,您需要执行以下操作。

在我上面显示内容文件的地方,您将找到提交的第二个文件的内容,包括密码。您应该编辑密码,但保持文本长度不变!这是为了让 Content-length 和 Text-content-length 保持正确!(您也可以调整长度,但您会遇到更多麻烦)但现在的问题是,您上面看到的 md5 和 sha1 校验和不匹配。您必须根据修改后的文件内容生成新的 md5 和 sha1,这可能非常棘手,但也不是太难!

完成编辑后,您需要将修改后的转储文件加载到新的存储库中

svnadmin create newrepo
svnadmin load newrepo < file.dump

相关内容