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

如何从SVN中的修订中删除1个文件?,svn,Svn,我的一个同事在SVN中签入了一些文件,其中一个文件中有密码。密码已从文件中删除,并签入了新版本,但如果查看修订历史并转到该修订,密码显然仍在存储库中。(我们使用陆龟作为客户。) 那么,如何从SVN中的存储库中安全地删除单个文件呢?我不确定。您始终可以创建一个新文件并将最新版本复制到该文件中,从而清除以前的版本历史记录 也许您应该更改生产密码,以完全避免svn问题。这不太好:似乎有效。所以我所做的是: 将文件复制到另一个文件夹 从当前文件夹中执行一次TortoiseSVN删除,然后执行一次提交 将

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


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

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

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

这不太好:

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

  • 将文件复制到另一个文件夹
  • 从当前文件夹中执行一次TortoiseSVN删除,然后执行一次提交
  • 将文件复制回文件夹中
  • 使用TortoiseSVN添加文件并再次提交
  • 我现在似乎找不到任何修订历史记录——不过,可能是我找的地方不对

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

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

    我现在似乎找不到任何修订历史记录——不过,可能是我找的地方不对


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

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

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

    (一旦实现,就不需要此脚本)

    (这个剧本不是我写的,我是从


    您的密码仍然存在(svn catfile@2342其中2342是修订版,文件仍在那里)


    您可以“svnadmin dump”重新存储到文件,搜索并用替换密码“ultrasecret”,“svnadmin创建”新回购,“svnadmin加载”修改后的转储到新回购中。请注意转储文件中的二进制数据,因此请使用适当的编辑器/sed。

    您的程序大纲将断开链接,以便查看当前的头文件和它;的历史记录不会轻易向您显示原始检查。但是,如果您将修订设置回删除之前的版本,您将能够再次看到它。脚本似乎可以工作,当您进入成千上万个修订的10个版本时,需要很长时间来运行每个修订。我想知道抄近路并只使用最后20个版本会有多安全。
    #!/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()