重构期间文件SVN历史记录丢失

13

在进行一些重构时,我正在移动文件。显然,由于 IDE 未触发 SVN 重命名/移动操作,因此 SVN 将其视为删除文件并创建新文件。不过我认为 SVN 服务器会足够聪明以便检测到它,但实际情况并非总是如此......我正在使用 Tortoise SVN,而且我取消了“停止复制/重命名”按钮。

这是否是预期的结果?有没有解决方法?我应该使用 Tortoise SVN shell 命令来移动文件,而不是让 IDE 进行常规文件移动?

此外,如果 SVN 不知道两个文件是相同的实体,是否可以手动强制将其链接起来?比如告诉它:“/com/john/test.tct 与 /com/john/test/file.txt 相同”?

4个回答

25
使用SVN的做法实际上是让SVN重命名文件(使用svn move或使用TortoiseSVN的“Rename”)。但是,如果您绝对需要某个外部工具来执行重命名操作,您可以使用TortoiseSVN修复移动操作。以下将告诉SVN新文件实际上是被重命名的旧文件:
  1. 打开“检查修改”窗口。
  2. 标记旧文件名(列为丢失)和新文件名(列为未版本化)。
  3. 右键单击此选择,然后选择“修复移动”。

注意:我是凭记忆输入的。它可能不完全正确。还有其他方法可以完成此操作(如在资源管理器中标记文件)。

如果您已经在非常需要一个文件历史记录的文件上失去了历史记录,您可以复活旧文件(通过将旧版本的版本 svn copy 到其旧位置),将新文件的历史记录并入其中,然后删除新文件 ,并将旧文件 svn move 到新文件的名称。


1
谢谢,非常有趣。我认为通过SVN客户端完成所有这些操作是不可行的,因为许多重构操作会自动执行此操作,然后您将面临手动更新项目/构建文件,这实际上只是转移问题。我肯定会尝试Tortoise工具...但是它肯定必须包装标准的SVN操作,那么它们是什么? - Mr. Boy
@John:这可能只是简单地包装svn move,但我从未尝试过当source已被重命名为target时,svn move source target会发生什么,所以情况可能比那更复杂。我不知道。 - sbi
1
请查看此处有关如何修复重命名/移动的详细描述:http://tortoisesvn.net/node/351 - Stefan
@Stefan:感谢你提供的链接,也非常感谢你为这个项目所付出的所有时间! - sbi
4
斯特凡的链接已经失效,我认为这是新链接:http://tortoisesvn.net/repairmoves.html。 - Dan

2
你可以安装(免费的)Visual Studio插件AnkhSVN。这将跟踪你的文件重命名操作,使得在Subversion中不会丢失历史记录。
文件重命名操作是由Subversion客户端跟踪的。如果你使用Windows资源管理器或者Visual Studio解决方案资源管理器而不是TortoiseSVN或AnkhSVN进行文件重命名,那么Subversion将无法识别重命名操作(只有删除和添加操作)。
顺便说一下,使用AnkhSVN还有其他优点,比如直接在解决方案资源管理器中显示文件的Subversion状态。
另外还有一个商业软件VisualSVN,与AnkhSVN类似。

这不是Visual Studio...实际上这是一个Flex项目。那么这是一个常见的问题吗?我曾经在VS上使用过VisualSVN,它非常好,但我不知道它是否跟踪移动。 - Mr. Boy
@John:哎呀,抱歉。但是,正如我所写的那样,这是一个常见问题。您必须使用子版本控制客户端(例如TortoiseSVN的重命名命令)来重命名文件。我不知道Flex IDE是否有类似的插件。 - M4N

1

当查看日志时,Tortoise默认为复制停止。

如果您取消勾选日志查看器上的该框,则可以查看文件/目录的完整历史记录。


0

如果您重命名了存储库项目并进行了大量重命名(例如类等),则可能会注意到“显示日志”将不再显示重命名之前存在的所有历史记录。

但是,不用担心,它并没有丢失。这只是一个标记。要再次显示历史记录,请右键单击您的项目> TortoiseSvn> Show Log,然后在打开的对话框中取消选中复选框“停止复制/重命名”,所有历史记录将再次显示:

enter image description here


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