Post

版本库彻底删除文件

版本库彻底删除文件

wanlinwang, 2023/08/08

SVN(Subversion)操作总结

方法一:只保留一个Revision

关键点: 使用svnadmin dump导出最新的revision。

步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# step1: 获取最新的revision号
svnlook youngest /path/to/svn/repo_dir

# step2: 执行热备份(不保留日志)
svnadmin hotcopy --clean-logs /path/to/svn/repo_dir /path/to/svn/repo_new_dir01

# step3: 导出最新revision
svnadmin dump /path/to/svn/repo_new_dir01 -r <youngest_revision>:<youngest_revision> > /path/to/svn/repo_in_youngest_revision.dump

# step4: 创建新的仓库
svnadmin create --fs-type fsfs /path/to/svn/repo_new_dir

# step5: 将导出的revision加载到新的仓库
svnadmin load /path/to/svn/repo_new_dir < /path/to/svn/repo_in_youngest_revision.dump

# step6: 重命名仓库目录
mv /path/to/svn/repo_dir /path/to/svn/repo_dir_bak20230808
mv /path/to/svn/repo_new_dir /path/to/svn/repo_dir

说明:

  • 这种方法只保留了最新的revision。由于Subversion是基于节点增量存储,对没有修改的文件和目录会引用早期的revision,因此执行svnadmin dump -r <youngest_revision>时,会对每个节点进行递归重建,操作较为耗时。

方法二:保留所有Revision

关键点: 使用svndumpfilter命令。

步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# step1: 导出整个仓库
svnadmin dump /path/to/svn/repo_dir > repo_dir.dump

# step2: 使用svndumpfilter过滤不需要的目录
cat repo_dir.dump | svndumpfilter exclude path/to/dir1 path/to/dir2 > filtered.dump

# step3: 创建新的仓库
svnadmin create --fs-type fsfs /path/to/svn/repo_new_dir

# step4: 将过滤后的数据加载到新仓库
svnadmin load /path/to/svn/repo_new_dir < filtered.dump

# step5: 重命名仓库目录
mv /path/to/svn/repo_dir /path/to/svn/repo_dir_bak20230808
mv /path/to/svn/repo_new_dir /path/to/svn/repo_dir

说明:

  • 该方法保留所有的revision,仅通过过滤不需要的目录来实现精简。由于是导出全部revision,并且只做简单的过滤,操作相对较为快速。

方法三:保留所有Revision(基于路径限制)

关键点: 通过path-based限制访问并使用svnsync同步仓库。

步骤如下:

1
2
# step1: 在authz文件中定义待删除的目录或文件为不可读。
# step2: 执行svnsync复制仓库。

说明:

  • 此方法未完全调研,但其主要思想是通过限制访问路径,再进行同步复制。这种方法可能对某些场景适用,但具体效果需要进一步验证。

比较表

方法效果耗时备注
方法一删除历史revision需要重新checkout一份仓库
方法二保留所有revision需要重新checkout一份仓库
方法三未调研未调研未调研

结论:选择方法二

经测试和讨论,推荐采用方法二,即保留所有的revision,并通过svndumpfilter进行过滤。这是一个较为高效且简单的解决方案。

测试记录

方法一:

  • 耗时:约3小时
1
2
3
4
5
6
8:54   svnlook youngest test_repo_bak20230728000501
8:55   svn info file:///data/user/wanin/test_repo_bak20230728000501
10:05  svnadmin dump test_repo_bak20230728000501 -r 11998 > test_repo_dump_r11998.dmp
10:06  svnadmin create --fs-type fsfs test_repo_dump_r11998_new_repo
10:06  svnadmin load test_repo_dump_r11998_new_repo < test_repo_dump_r11998.dmp
10:05  完成时间约:1小时55分钟

方法二:

  • 耗时:约43分钟
1
2
3
4
5
6
仓库test_repo_bak20230808201044有12000个revision。
20:55  svnadmin dump test_repo_bak20230808201044 > test_repo_bak20230808201044.dump
21:14  ls test_repo_bak20230808201044.dump
21:15  cat test_repo_bak20230808201044.dump | svndumpfilter exclude `cat filelist.txt | xargs` > test_repo_bak20230808201044_filtered.dump
21:19  svnadmin create --fs-type fsfs test_repo_bak20230808201044_filtered
21:38  svnadmin load test_repo_bak20230808201044_filtered < test_repo_bak20230808201044_filtered.dump

Git操作参考

参考文档:从存储库中删除敏感数据 - GitHub 文档

This post is licensed under CC BY 4.0 by the author.

支持创作者

如果本文帮助到你,可以通过以下收款码支持我:

收款码

感谢你的支持!