【问题标题】:Delete file with all history from svn repository从 svn 存储库中删除包含所有历史记录的文件
【发布时间】:2010-01-12 16:29:17
【问题描述】:

有什么方法可以从 svn 存储库中删除文件,包括其所有历史记录?当我想摆脱存储在 repo 中的大型二进制文件时,就会出现这个问题。

我只知道一种可能在这种情况下有所帮助的方法:

  1. svnadmin 实用程序的帮助下转储所有 repo。
  2. 使用grep 过滤转储文件。 Grep 应该使用文件名并写入另一个转储文件
  3. 使用svnadmin 导入最后一个转储文件

但这太复杂且不可靠。也许还有其他解决方案?

【问题讨论】:

    标签: svn repository version-control


    【解决方案1】:

    最近使用命令svndumpfilter 变得更加简单。详细信息可在颠覆文档here 中找到。基本上,为了避免冲突(解释为here),它需要一个 repo 转储并重做每个提交,包括或排除给定的文件前缀。基本语法:

    svndumpfilter exclude yourfileprefix < yourdump > yournewdump
    

    Exclude 可能是提问者正在寻找的内容,但您也可以使用 include 来提取存储库的子树,以便将其作为自己的存储库分离出来。

    subversion (very meta) 中最新版本的 subversion 也可以采用 glob 模式。我最近不得不从一个 repo 中删除所有 pdf 文件,这样做很容易:

    svndumpfilter exclude --pattern '*.pdf' < dump > dump_nopdfs
    

    更多使用信息,请致电svndumpfilter helpsvndumpfilter help exclude

    【讨论】:

    • 所以整个过程是:svnadmin dump &gt; myDump; svndumpfilter exclude myFile &lt; myDump &gt; newDump; cat newDump | svnadmin load myRepositoryURL; 对吗?
    • 好的,我试过了,过程看起来很像这样:svnadmin dump path_to_repository &gt; old.dump; svndumpfilter exclude file_prefix &lt; old.dump &gt; new.dump; rm -rf path_to_repository; svnadmin create path_to_repository; svnadmin load path_to_repository &lt; new.dump; 主要区别在于您必须在加载过滤后的转储之前删除存储库并重新创建它。另请注意 path_to_repository 是服务器上存储库的路径,而不是工作副本的路径。
    • 是的,没关系,但您可以省略临时文件。你可以这样做: svnadmin create path_to_NEW_repository; svnadmin 转储 path_to_CURRENT_repository | svndumpfilter 排除文件前缀 | svnadmin 加载 path_to_NEW_repository;当然,您必须为 web 配置新的存储库。测试它。如果一切正常,则使用或关闭 www 检查空闲,将 CURRENT 重命名为 OLD,然后将 NEW 重命名为 CURRENT,启用访问。如果一切正常,您可以在需要时出于任何原因备份旧目录,并恢复以前的 Web 配置。不要不假思索地删除任何源数据:)
    【解决方案2】:

    但这太复杂且不可靠。

    我不知道为什么这不应该被认为是可靠的。但是,如果您想完全摆脱文件、历史记录和所有内容,那么无论该文件所属的先前版本的影响如何,只有一种方法可以做到这一点,而且这种方法确实很复杂。没错。 SVN 是一个只有一个目标的工具:永远不会丢失任何文件,即使它已被删除。强迫它做其他事情应该很难。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,除了我需要删除多个文件,而不仅仅是一个文件,而且我们使用的是不支持 --patern 指令的 Subversion 1.6。

      --备份当前SVN

      $ cp -R /svn  /svnSAVE
      

      -- 转储仓库

      $ svnadmin dump /svn/root > svnDump
      

      -- 在排除非常大的文件时创建新的转储

      $ svndumpfilter exclude "/path/file.csv" < svnDump > newSvnDump0
      -- {note: should see a message like this}:
      --          Dropped 1 node:
      --                  '/path/file.csv'
      

      -- 创建另一个新转储,同时排除另一个非常大的文件

      $ svndumpfilter exclude "/path/anotherFile.csv" < newSvnDump0 > newSvnDump1
      

      -- 删除旧的svn

      $ rm -rf /svn
      

      -- 重新创建 svn 目录

      $ mkdir -p /svn/root
      

      -- 重新创建 SVN

      $ svnadmin create /svn/root
      

      -- 使用转储重新填充新存储库

      $ cat newSvnDump1 | svnadmin load /svn/root
      

      -- 将已保存副本中的 conf 文件更新到新副本中...

      $ cp /svnSAVE/root/conf/* /svn/root/conf
      

      现在存储库不应包含 2 个大文件“file.csv”和“anotherFile.csv”

      【讨论】:

        【解决方案4】:

        我同意 McDowell 的提议,但建议您考虑将大文件替换为仅包含已删除条目的文件哈希的文本文件。

        如果您有大量的 .o 文件,例如意外签入构建目录,这可能不合适。但是,如果您要从包含一堆您想要的二进制工件的目录中删除一堆您不想要的二进制工件,那么您很可能会犯一个代价高昂的错误。至少,考虑从主干和大多数分支中删除它们,但留下一个充满占位符文本文件的特性分支,并带有原始二进制文件的哈希。这至少足以弄清楚后来发生了什么,验证不应该删除的杂散副本实际上是正确的文件,并将其重新置于修订控制之下。

        而且,显然,在你考虑做任何这些事情之前,将整个 repo 备份为只读的东西,比如几个 M-Discs 或其他东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多