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

15 svn

我的PC上有一个本地的svn存储库,我一直用它来做一个业余爱好项目,并不是任何人都可以访问的,所以我提交了带有密码的文件.

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

有没有办法抓取存储库并用"xxxxxxxxxx"之类的文本替换所有密码和帐户数据?

Mat*_*att 9

如果你做了

svnadmin dump > mysvn
Run Code Online (Sandbox Code Playgroud)

您将获得存储库中所有修订版的所有数据的平面文件.从那里,你应该能够手动编辑文件(如果你的repo大小很重要,你可能需要一个行编辑器,如pico,nano,vi等).

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

svnadmin load /path/to/new/repo < mysvn
Run Code Online (Sandbox Code Playgroud)

在您接受审计等的任何公司环境中,这种做法都被视为禁忌,但对于业余爱好项目,它可能只是为您做的伎俩.

编辑:在尝试将两个不同的存储库合并在一起之前,我必须这样做,因此需要在平面文件中添加一个新的"目录节点".我不确定SVN是否散列文件或更改以确定它是否被篡改.


小智 7

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

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

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

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


dr *_*rry 5

我有同样的问题,但比在 code.google.com 上:我签入了一些文件,这些文件不应该通过 googlecode 上的历史记录访​​问,但我不想放弃所有历史记录,经过一些谷歌搜索、尝试、重试和重试后,我成功了。下面是适用于我的小项目的食谱(6.5 MB,90 次修订)。大部分知识来自googlecode,其余大部分来自svn redbook

首先创建一个本地存储库,您可以将 googlecode 的存储库下载到:

svnadmin create /tmp/your_local_repo
Run Code Online (Sandbox Code Playgroud)

创建包含内容的文件 /tmp/isd_gc/hooks/pre-revprop-change

#!/bin/bash
exit 0
Run Code Online (Sandbox Code Playgroud)

使其可执行:

chmod +x /tmp/isd_gc/hooks/pre-revprop-change
Run Code Online (Sandbox Code Playgroud)

如果您在此部分失败,您很可能会看到错误:Revprop更改被pre-revprop-change钩子阻止(退出代码255),没有输出。

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

svnsync init --username yourname@youremail file:///tmp/your_local_repo https://yourproject.googlecode.com/svn 
Run Code Online (Sandbox Code Playgroud)

并开始下载所有历史记录:

svnsync sync --username  yourname@youremail file:///tmp/your_local_repo
Run Code Online (Sandbox Code Playgroud)

提交修订1。

复制修订版 1 的属性。

传输文件数据................................

复制修订版 87 的属性。

现在我们创建一个转储文件,该文件将被提供给 svndumpfilter 以删除不需要的文件。

svnadmin dump . > /tmp/tst_dump_gc.dmp
Run Code Online (Sandbox Code Playgroud)

使用 svndumpfilter 从中删除第一个不需要的文件。

svndumpfilter exclude /trunk/unwanted file_1.jsvg < /tmp/tst_dump_gc.dmp > /tmp/tst_dump_clean1.dmp
Run Code Online (Sandbox Code Playgroud)

删除 1 个节点:

'/trunk/不需要的 file_new.jsvg'

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

svndumpfilter exclude /trunk/unwanted file_2.jsvg < /tmp/tst_dump_clean1.dmp > /tmp/tst_dump_clean2.dmp
Run Code Online (Sandbox Code Playgroud)

重新创建“旧临时仓库”

rm -rf /tmp/your_local_repo

svnadmin create /tmp/your_local_repo
Run Code Online (Sandbox Code Playgroud)

将过滤后的转储加载到存储库中

[/tmp]$svnadmin load --ignore-uuid your_local_repo < /tmp/tst_dump_clean2.dmp
Run Code Online (Sandbox Code Playgroud)

检查 svn 客户端中的一切是否正常(在主干上进行历史记录检查仅在我的 svn 客户端中显示 25 个第一个结果)。

svnsync sync --username yourname@youremail https://yourproject.googlecode.com/svn
Run Code Online (Sandbox Code Playgroud)


Dim*_*ima 0

最简单的事情是检查存储库的内容,删除所有敏感信息,将工作目录导入到新的存储库中,然后将其公开。很可能使用您项目的人都会对其当前状态感兴趣,而不是更改历史记录。