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

时间:2020-03-05 18:44:47  来源:igfitidea点击:

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

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

解决方案

回答

我不知道。我们总是可以创建一个新文件,然后将最新修订版本复制到该文件中,以清除以前的修订历史记录。

回答

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

回答

链接到有关此问题的Subversion FAQ条目

回答

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

回答

那似乎行得通。所以我所做的是:

  • 将文件复制到另一个文件夹。
  • 从当前文件夹中删除TortoiseSVN,然后提交。
  • 将文件复制回到文件夹中。
  • 使用TortoiseSVN添加文件并再次提交。

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

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

(顺便说一句,我很抱歉没有提早更准确地提出问题,因为我从未提到过其中一种选择是消除所有修订历史记录,因为这对我而言是没有发生的。)

回答

I can't seem to find any revision history now - however, it could just be that I'm not looking in the right place.

我们可以通过查看文件夹历史记录来查看它,它会为我们提供文件仍在其中的修订版本,因此我们可以恢复机密文件。因此,这是一个糟糕的解决方案。

回答

如果是最后一个修订版(HEAD),则可以(事先备份存储库)删除db \ revs和db \ revprops中该修订版的文件,然后运行以下python脚本来修复存储库认为HEAD的修订版。

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

(一旦实施了SVN消除,则无需使用此脚本)

(我没有写这个脚本,我从这里得到的)

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

回答

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

我们可以对文件进行回购,然后将其" svnadmin dump"" svnadmin dump"搜索,替换为" ultrasecret"," svnadmin创建"新的repos并将" svnadmin加载"修改后的转储到新的repos中。转储中的二进制数据,因此请使用适当的编辑器/ sed。