如何从SVN的修订中删除1个文件?

时间:2008-08-29 01:40:01

标签: svn

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

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

8 个答案:

答案 0 :(得分:11)

答案 1 :(得分:7)

答案 2 :(得分:3)

  

我现在似乎无法找到任何修订历史 - 然而,可能只是因为我没有找到正确的地方。

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

答案 3 :(得分:2)

也许您应该更改生产密码以完全避免svn问题。

答案 4 :(得分:2)

如果是最后版本(HEAD),您可以(事先备份您的回购)删除db\revsdb\revprops中的修订文件然后运行以下python脚本来修复你回购认为HEAD的修订版。

e.g。如果head为522且密码是在520中提交的,则必须删除修订版520,521和522.

(实施SVN obliterate后不需要此脚本)

(我没有写这个脚本,我是从here获得的)

#!/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()

答案 5 :(得分:2)

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

你可以'svnadmin转储''你回收一个文件,搜索并用“ultrasecret”替换你的密码,'svnadmin创建''新的repos和'svnadmin加载''修改后的转储到新的回购要注意转储中的二进制数据,所以使用正确的编辑器/ sed。

答案 6 :(得分:0)

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

  1. 将文件复制到另一个文件夹。
  2. 从当前文件夹中删除TortoiseSVN,然后提交。
  3. 将文件复制回文件夹。
  4. 使用TortoiseSVN添加文件并再次提交。
  5. 我现在似乎无法找到任何修订历史 - 然而,可能只是因为我没有找到正确的地方。

    现在修改后的问题是,如何查找已删除的文件的修订历史记录,然后重新提交给SVN?

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

答案 7 :(得分:-3)

我不确定。您可以随时创建一个新文件并将最新版本复制到该文件中,从而消除之前的修订历史记录。