版本库彻底删除文件
版本库彻底删除文件
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操作参考
This post is licensed under CC BY 4.0 by the author.