8

我的一位同事在 SVN 中签入了一些文件,其中一个文件中有密码。密码已从文件中删除并签入了新版本,但如果我们查看修订历史并转到该修订,则密码显然仍在存储库中。(我们使用 TortoiseSVN 作为客户端。)

那么如何从 SVN 的存储库中安全地删除该单个文件呢?

4

8 回答 8

11

链接到关于此的颠覆常见问题解答条目

于 2008-08-29T01:42:55.120 回答
7

它不漂亮:如何从存储库的历史记录中完全删除文件?

于 2008-08-29T01:43:38.300 回答
3

我现在似乎找不到任何修订历史 - 但是,可能只是我没有找对地方。

您可以通过查看文件夹历史记录来查看它,这将为您提供文件仍然存在的版本,因此您将能够恢复机密文件。所以这是一个糟糕的解决方案。

于 2008-08-29T02:13:47.463 回答
2

也许你应该改变你的生产密码来完全避免 svn 问题。

于 2008-08-29T01:42:43.077 回答
2

如果它是最后一个修订版(HEAD),您可以(预先备份您的 repo)删除该修订版的文件,db\revs然后db\revprops运行以下 python 脚本来修复您 repo 认为 HEAD 的修订版。

例如,如果 head 是 522 并且密码是在 520 中提交的,则您必须删除修订版 520,521 和 522。

(一旦实现了SVN obliterate就不需要这个脚本了)

(这个脚本不是我写的,我从这里得到的)

#!/usr/bin/python

def dec_to_36(dec):
  key = '0123456789abcdefghijklmnopqrstuvwxyz'
  result = ''
  while 1:
    div = dec / 36
    mod = dec % 36
    dec = div
    result = key[mod] + result
    if dec == 0:
      break
  return result


import os, re, sys

repo_path = sys.argv[1]
rev_path = os.path.join(repo_path, 'db', 'revs')
current_path = os.path.join(repo_path, 'db', 'current')

id_re = re.compile(r'^id:\ ([a-z0-9]+)\.([a-z0-9]+)\.r([0-9]+).*')

max_node_id = 0
max_copy_id = 0
max_rev_id = 0

for rev in os.listdir(rev_path):
  f = open(os.path.join(rev_path, rev), 'r')

  for line in f:
    m = id_re.match(line)
    if m:
      node_id = int(m.group(1), 36)
      copy_id = int(m.group(2), 36)
      rev_id = int(m.group(3), 10)

      if copy_id > max_copy_id:
        max_copy_id = copy_id

      if node_id > max_node_id:
        max_node_id = node_id

      if rev_id > max_rev_id:
        max_rev_id = rev_id

f = open(current_path, 'w+b')
f.write("%d %s %s\n" % (max_rev_id, dec_to_36(max_node_id+1),
                        dec_to_36(max_copy_id+1)))
f.close()
于 2008-09-11T14:41:51.300 回答
2

您的密码仍然存在(svn cat file@2342,其中 2342 是文件仍然存在的修订版)。

你可以''svnadmin dump''你repos到一个文件,搜索并用'ultrasecret'替换你的密码,''svnadmin create''一个新的repos和''svnadmin load''修改后的转储到那个新的repos。注意转储中的二进制数据,因此请使用适当的编辑器/sed。

于 2009-01-07T02:07:16.297 回答
0

这似乎奏效了。所以我所做的是:

  1. 将文件复制到另一个文件夹。
  2. 从当前文件夹中执行 TortoiseSVN 删除,然后提交。
  3. 将文件复制回文件夹中。
  4. 使用 TortoiseSVN 添加文件并再次提交。

我现在似乎找不到任何修订历史 - 但是,可能只是我没有找对地方。

所以现在修改后的问题是,我怎样才能找到被删除然后重新提交给 SVN 的文件的修订历史?

(顺便说一句,我很抱歉之前没有更准确地提出这个问题,因为我从未提到其中一个选项是删除所有修订历史,因为我没有想到它。)

于 2008-08-29T02:02:51.513 回答
-3

我不知道。您始终可以创建一个新文件并将最新版本复制到该文件中,从而清除之前的版本历史记录。

于 2008-08-29T01:42:33.403 回答