【问题标题】:How do I delete 1 file from a revision in SVN?如何从 SVN 的修订中删除 1 个文件?
【发布时间】:2008-08-29 01:40:00
【问题描述】:

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

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

【问题讨论】:

    标签: svn


    【解决方案1】:
    【解决方案2】:
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果它是 last 修订版 (HEAD),您可以(BACKING UP 提前)删除该修订版在 db\revsdb\revprops 中的文件,然后运行遵循 python 脚本来修复你 repo 认为 HEAD 的修订版。

        例如如果 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()
        

        【讨论】:

        • 脚本似乎可以工作,当您进入成千上万个修订版时,需要很长时间才能运行每个修订版。我想知道使用最近 20 次修订的捷径会有多安全。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

          • 你有大纲的过程会破坏链接,因此查看当前的 HEAD 文件及其历史不会轻易地显示原始检查。但是,如果您将修订设置回删除之前的版本,您将能够再次看到它。
          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2012-11-29
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 2012-02-13
            • 2016-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多