从旧的Subversion版本库中删除一个文件

我们对于我们的Subversion版本库有一个相当严格的策略,这也是一个很大的不便。 通过我们的分支机构,任何进入Subversion的东西都必须具有编辑authentication证书(例如数据库,用户帐户等)。 一个文件被添加并提交了名字和密码。 这个xml文件有三个版本:

首先 – 文件被添加和承诺一些不相关的(对这个问题)的内容。
第二 – 文件(在其他3个不相关的文件之间)提交了身份validation凭证,作为一个全新的XML块的一部分。
第三 – 更多的文件被添加和签入,没有一个是以前版本的坏文件的更新版本。
第四 – 单一的坏文件再次被检入与validation凭证(特别是,没有别的)被删除。

我想删除第二个版本,因为这是发生这种情况的第一次发生,我以前从来没有处理过这个。 我知道这是颠覆的难度,因为软件的目的是维护你的代码版本,而不是select修改旧版本。 是否有可能删除以前版本中的一个文件,或用新版本的内容覆盖它(即用第四个文件replace第二个版本中的坏文件)?

目前在Subversion中没有obliteratefunction。 已经有几次讨论过,但是这个库的完整性混乱了,还没有被执行 。

警告:这个链接已经有11年的时间讨论svn obliterate

解决方法是使用svnadmin dump ( LINK )备份存储库,然后使用svndumpfilter ( LINK )恢复存储库,防止将特定修订添加到已恢复的存储库。

你可以用一些创造性的转储文件编辑来做到这一点。 首先你需要使用转储你的版本库

 svnadmin dump repolocation > file.dump 

您需要在文本编辑器中打开file.dump文件,并查找添加文件的修订版本。 查找版本号: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 

如果删除上面的块,那么转储文件应该仍然可以工作,并且当将转储文件加载到新的存储库时,它将会像第二个文件从未添加到存储库

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

在上面显示contentsinfile的地方,你会发现第二个文件的内容包括密码。 您应该编辑密码,但保持文本的长度相同! 这是为了保持内容长度和文本内容的长度是正确的! (你也可以调整长度,但是你正在寻找更多的麻烦)现在的问题是,上面看到的MD5和SHA1校验和不匹配。 您将不得不基于修改过的文件内容生成新的md5和sha1,这可能相当棘手,但不是太难!

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

 svnadmin create newrepo svnadmin load newrepo < file.dump