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

16

我在我的个人电脑上有一个本地svn代码仓库,我一直在用它来进行业余项目开发,这些文件不打算对其他人开放,所以我将密码等信息直接存储在其中。

现在,我想要将代码仓库共享给其他人使用,但是又不想让他们看到这些密码等私密信息。

是否有方法可以遍历整个代码仓库,并将所有的密码和账户数据替换为类似 "xxxxxxxxxx" 的文本?

5个回答

13

1
请添加执行命令。我没有理解帮助中所说的内容。svnadmin dump 存储库,然后通过 svndumpfilter(排除错误路径)将转储文件传输到 svnadmin load 命令中是什么意思?链接中也没有提供详细信息。 - Hunsu

10
如果您进行一个
svnadmin dump > mysvn

您将获得一个扁平化的文件,其中包含存储库中所有修订版的所有数据。从那里开始,您应该能够手动编辑文件(如果您的存储库相当大,则可能需要行编辑器,如pico、nano、vi等)。

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

svnadmin load /path/to/new/repo < mysvn

在任何需要接受审计等程序的公司环境中,这种做法都会被视为不可取,但对于一个业余项目来说,可能会奏效。

编辑:我曾经试图将两个不同的代码库合并在一起,因此需要向平面文件中添加一个新的“目录节点”。我不确定 SVN 是否会哈希文件或更改以确定是否被篡改。


1
它在重新加载数据时确实会检查校验和。刚尝试过这种方法解决类似的问题。 :) - Iain
这会起作用,但您需要更新任何已编辑的文件(node-paths)的 md5sum。在 vim 中,您可以使用 ctrl-v 来突出显示表示文件的部分,然后键入“:!md5sum”以获取新哈希。文件从 PROPS-END 行后开始,以两个空行结束,然后是下一个“Node-Path:”行。 - Mark Grimes

8
似乎有误解。我不想删除文件,而是想删除存储在代码库中的密码。我既不想丢失文件,也不想丢失修订、修改和历史记录。
我所做的是Matt建议的方法,即转储代码库并进行编辑。
为此,我使用了十六进制编辑器(khexedit)将密码字符串替换为相同长度的字符串。这样,我就不必更新大小字段。
接下来,我需要使用文件内容的哈希值更新md5字段。为此,我编写了一个脚本,使用“svnadmin load”输出生成错误,并从该错误获取旧的和新的md5。然后,用sed替换旧哈希,重复操作直到没有错误。

svnadmin dump repo > svn.dump 执行,然后找到需要编辑的文件版本。导出这些文件 (svn export file@r1234 file.1234)。将导出的文件复制到 file.1234.modified。用 x 覆盖密码,使其大小相同。获取新的 md5sum 和 sha1sum (md5sum file.*; sha1sum file.*)。在 vim 中打开 svn.dump 并搜索修改前的 md5sum。像修改过的文件一样精确地覆盖密码,并更新 md5sum 和 sha1sum。然后执行 mv repo repo.bak && svnadmin load repo < svn.dump - dannysauer

5
我曾经遇到过同样的问题,但是在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,并填写以下内容。
#!/bin/bash
exit 0

使其可执行:

chmod +x /tmp/isd_gc/hooks/pre-revprop-change

如果你在这一步失败了,你很可能会看到一个错误: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output。

现在你可以从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

删除了1个节点:

'/trunk/unwanted file_new.jsvg'

移除第二个不需要的文件:

svndumpfilter exclude /trunk/unwanted file_2.jsvg < /tmp/tst_dump_clean1.dmp > /tmp/tst_dump_clean2.dmp

重新创建“旧临时存储库”。
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

0

最简单的方法是查看存储库的内容,删除所有敏感信息,将工作目录导入新的存储库,并使其对公众可用。很可能使用您的项目的人会对其当前状态感兴趣,而不是变更历史记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接