在SVN中分割文件并保留历史记录

19

在重构代码时,有时需要将一个源文件拆分为两个或多个文件(例如当一个类变得非常大时,应该将其拆分为两个类)。

例如,假设A是原始文件,B1和B2是新的文件。

是否可能告诉SVN,让B1和B2都“继承”文件A的完整历史记录,这样当我查看B1和B2的历史日志时,可以看到它们已经从A中分离出来,并且日志看起来像这样:

A                B1                  B2
- change A3      - change B1.2       - change B2.2
- change A2      - change B1.1       - change B2.2
- change A1      - change A3         - change A3
                 - change A2         - change A2
                 - change A1         - change A1

我知道如何在文件重命名时保留历史记录(就像在这里的SO上讨论的那样),但据我所知,这只是一种保留与B1或B2相关联的A的历史记录的方法,而不是两者都关联的方法。

目前我正在Windows上使用Tortoise SVN 1.6.12。


3
这个问题是对于时间旅行的分支时间线的隐喻,对吗,博士? - ACK_stoverflow
@ACK_stoverflow:你抓住我了;-) - Doc Brown
1个回答

27

只需创建文件A的2个SVN副本,然后将文件A删除。

我刚刚用一个新的存储库进行了快速测试,似乎完美运行。

  1. 我创建了一个名为A.txt的文件,里面有B1和B2两个类,并提交了A.txt文件。
  2. 我将A.txt文件复制到B1.txt文件中,并从B1.txt中删除了B2类的声明。
  3. 我将A.txt文件复制到B2.txt文件中,并从B2.txt中删除了B1类的声明。
  4. 我删除了A.txt文件。
  5. 提交所有更改,历史记录看起来很好。

8
使用TortoiseSVN复制文件最简单的方法是右键拖动该文件。上下文菜单将显示一些选项,如SVN复制和SVN移动,同时可以重命名。 - jbvo
有没有一种方法可以从 .Net 代码中以编程方式执行 SVN 复制?我需要自动完成上述步骤。使用 Microsoft Roslyn(针对 .Net 代码)可以通过语义方式检测文件中的类并处理它们。 - Ebeid ElSayed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接