我的PC上有一个本地的svn存储库,我一直用它来做一个爱好项目,并不是任何人都可以访问的,所以我提交了带密码的文件。
现在,我正在考虑为其他人提供存储库,我不想在那里拥有这些数据。
有没有办法抓取存储库并用“xxxxxxxxxx”等文本替换所有密码和帐户数据?
答案 0 :(得分:13)
检查Subversion常见问题解答:How do I completely remove a file from the repository's history?
答案 1 :(得分:9)
如果你做了
svnadmin dump > mysvn
您将获得存储库中所有修订版的所有数据的平面文件。从那里,你应该能够手动编辑文件(如果你的repo大小很重要,你可能需要一个行编辑器,如pico,nano,vi等)。
最后,您可以将此转储重新加载到新存储库中。这将保留您的项目历史记录。
svnadmin load /path/to/new/repo < mysvn
在您接受审计等的任何公司环境中,这种做法都被视为禁忌,但对于业余爱好项目,它可能只是为您做的。
编辑:在尝试将两个不同的存储库合并在一起之前,我必须这样做,因此需要在平面文件中添加一个新的“目录节点”。我不确定SVN是否散列文件或更改以确定它是否被篡改。答案 2 :(得分:7)
似乎存在误解。我不想删除文件。我想删除存储在存储库中的密码。我不想丢失文件,也不想丢失修改,修改和历史记录。
我所做的是Matt建议的,转储存储库并进行编辑。
为此,我使用了十六进制编辑器(khexedit)并用相同长度的字符串替换了密码字符串。这样,我不必更新大小字段。
接下来,我需要使用文件内容的哈希更新md5字段。为此,我编写了一个脚本,使用“svnadmin load”输出生成错误并从该错误中获取旧的和新的md5。接下来,用sed替换旧的哈希,然后重复,直到没有错误。
答案 3 :(得分:4)
我遇到了同样的问题,但是在code.google.com上:我检查了一些文件,这些文件不应该通过googlecode上的历史记录访问,但我不想放弃所有历史记录,经过一些谷歌搜索,尝试,重试和重试我成功了。在我的小项目工作的配方下面(6.5 MB,90个修订版)。大多数知识来自googlecode,其余大部分来自svn redbook
首先创建一个本地仓库,然后将googlecode的仓库下载到:
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更改被pre-revprop-change挂钩(退出代码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的复制属性。
现在我们创建一个dumpfile,它将被送到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
丢弃1个节点:
'/ trunk / unwanted file_new.jsvg'
删除第二个不需要的文件:
svndumpfilter exclude /trunk/unwanted file_2.jsvg < /tmp/tst_dump_clean1.dmp > /tmp/tst_dump_clean2.dmp
重新创建“old temp 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
检查svn客户端中的所有内容是否正常(在中继上执行历史记录检查仅在我的svn客户端中显示25个第一个结果)。
svnsync sync --username yourname@youremail https://yourproject.googlecode.com/svn
答案 4 :(得分:0)
最简单的方法是检查存储库的内容,删除所有敏感信息,将工作目录导入新的存储库,并将其提供给公众。很可能无论谁将使用您的项目,都会对其当前状态感兴趣,而不是对更改历史感兴趣。