从SVN历史记录中删除文件内容

从SVN历史记录中删除文件内容,svn,Svn,我的电脑里有一个本地的svn存储库,我一直在用它做一个爱好项目,它并不意味着任何人都可以访问,所以我提交了带有密码的文件 现在,我正在考虑将存储库提供给其他人,我不想在那里有这些数据 是否有办法对存储库进行爬网,并将所有密码和帐户数据替换为“XXXXXXXXX”之类的文本?最简单的方法是签出存储库的内容,删除所有敏感信息,将工作目录导入到新的存储库中,并向公众开放。很可能使用您的项目的任何人都会对项目的当前状态感兴趣,而不是对更改历史感兴趣。如果您执行 svnadmin dump > my

我的电脑里有一个本地的svn存储库,我一直在用它做一个爱好项目,它并不意味着任何人都可以访问,所以我提交了带有密码的文件

现在,我正在考虑将存储库提供给其他人,我不想在那里有这些数据


是否有办法对存储库进行爬网,并将所有密码和帐户数据替换为“XXXXXXXXX”之类的文本?

最简单的方法是签出存储库的内容,删除所有敏感信息,将工作目录导入到新的存储库中,并向公众开放。很可能使用您的项目的任何人都会对项目的当前状态感兴趣,而不是对更改历史感兴趣。

如果您执行

svnadmin dump > mysvn
您将获得存储库中所有修订版的所有数据的平面文件。从那里,您应该能够手动编辑文件(如果您的回购协议的大小非常大,您可能需要一个行编辑器,如pico、nano、vi等)

最后,您将把这个转储重新加载到一个新的存储库中。这将保留项目的历史记录

svnadmin load /path/to/new/repo < mysvn
svnadmin加载/path/to/new/repo
这种做法在你接受审计等的任何公司环境中都被认为是不可取的,但对于一个爱好项目来说,它可能会帮你解决问题


编辑:在尝试合并两个不同的存储库之前,我必须这样做,因此需要在平面文件中添加一个新的“目录节点”。我不确定SVN是否对文件或更改进行哈希处理以确定其是否被篡改。

查看Subversion常见问题解答:

似乎存在误解。我不想删除一个文件。我想删除存储在存储库中的密码。我不想丢失文件,也不想丢失修订、修改和历史记录

我所做的是Matt建议的,转储存储库并编辑它

为此,我使用了十六进制编辑器(khexedit)并将密码字符串替换为相同长度的字符串。这样,我就不必更新大小字段


接下来,我需要用文件内容的散列更新md5字段。为此,我编写了一个脚本,它使用“svnadmin load”输出生成一个错误,并从该错误中获取新旧md5。接下来,用sed替换旧的散列,然后重复,直到没有错误。

我也有同样的问题,但不是在code.google.com上:我签入了一些文件,这些文件不应该通过谷歌代码上的历史记录来访问,但我不想放弃所有历史记录,在谷歌搜索、尝试、重试和重试之后,我成功了。下面是为我的小项目工作的配方(6.5MB,90次修订)。大部分的知识来自,其余的大部分来自

首先创建一个本地回购协议,将谷歌代码的回购协议下载到:

svnadmin create /tmp/your_local_repo
创建文件/tmp/isd_gc/hooks/pre revprop change with contents

#!/bin/bash
exit 0
使其可执行:

chmod +x /tmp/isd_gc/hooks/pre-revprop-change
如果您在此部分失败,您很可能会看到一个错误:Revprop更改被Revprop更改前挂钩(退出代码255)阻止,没有输出

现在您可以从code.google.com初始化svn同步

svnsync init --username yourname@youremail file:///tmp/your_local_repo https://yourproject.googlecode.com/svn 
并开始下载所有历史记录:

svnsync sync --username  yourname@youremail file:///tmp/your_local_repo
承诺修订1

复制了修订版1的属性

传输文件数据

复制了87版的属性

现在,我们创建一个转储文件,它将被馈送到svndumpfilter以删除不需要的文件

svnadmin dump . > /tmp/tst_dump_gc.dmp
使用svndumpfilter从中删除第一个不需要的文件

svndumpfilter exclude /trunk/unwanted file_1.jsvg < /tmp/tst_dump_gc.dmp > /tmp/tst_dump_clean1.dmp
将过滤后的转储加载到回购中

[/tmp]$svnadmin load --ignore-uuid your_local_repo < /tmp/tst_dump_clean2.dmp

实际上,它在重新加载数据时会检查校验和。刚刚针对类似的问题尝试了这种方法。:)这将起作用,但您需要为任何已编辑的文件(节点路径)更新md5sum。在vim中,可以使用ctrl-v突出显示表示文件的部分,然后键入“:!md5sum”以获取新的哈希值。文件从PROPS-END行之后开始,以两个空行结束,然后是下一个“节点路径:”行。请添加要执行的命令。我不明白他们在帮助中说了什么。svnadmin转储存储库,然后通过svndumpfilter(不包括坏路径)将转储文件传输到svnadmin load命令中是什么意思。链接中也没有提供详细信息。
svnadmin dump repo>svn.dump
,然后查找需要编辑的文件版本。导出那些文件(
svn导出file@r1234文件1234
)。将导出的文件复制到file.1234.modified。用
x
覆盖密码,使其大小相同。获取新的md5sum和sha1 SUM(
md5sum文件。*;sha1 SUM文件。*
)。在vim中打开svn.dump并搜索修改前md5sum。覆盖与修改文件中完全相同的密码,并更新md5sum和sha1sum。然后
mv repo repo.bak&&svnadmin load repo
rm -rf /tmp/your_local_repo

svnadmin create /tmp/your_local_repo
[/tmp]$svnadmin load --ignore-uuid your_local_repo < /tmp/tst_dump_clean2.dmp
svnsync sync --username yourname@youremail https://yourproject.googlecode.com/svn