如何在Visual Studio中重构而不丢失源代码控制历史记录?

8
使用ReSharper在Visual Studio 2010内部移动/重命名源文件是重构应用程序时的巨大帮助。Perforce源代码控制集成不能处理这些类型的更改,而不是将其视为无关的“从此处删除”“添加到此处”,这会打破历史记录链。我的问题是:
  1. 有没有办法强制Perforce插件一开始就做正确的事情?
  2. 如果没有,是否有任何外部方式可以在事后进行调和? (Perforce是否有任何识别已移动、可能已重命名并且有限内容更改的文件的方法?)
  3. 是否有其他源代码控制产品可以透明地处理此类问题?
谢谢!

我不确定我是否理解得正确,因为某些重构将始终被视为“删除然后添加”类型的更改。这实际上取决于您正在做什么。现在,如果Perforce将简单的重命名等视为“删除然后添加”,那就有问题了。 - Gregory A Beamer
如果您例如从命令行或Perforce GUI执行Move/Rename操作,Perforce会自动处理正确的事情。但如果您在VS中执行相同的操作,则不会。 - jlew
10个回答

3

这不仅是Perforce的一个缺陷,其他源代码控制系统也存在此问题。TFS也有相同的问题。

  1. 不,没有办法。
  2. 除了在提交注释中进行评论外,如果您确保提交仅包括删除和添加,则可以在某种程度上保持链接。
  3. 我相信Git可以做到。它还可以处理代码部分之间的移动。

Subversion应该可以处理这个,如果你重命名文件,你仍然可以通过单一的统一日志查看文件记录(至少我用tortoisesvn是这样)。就记录而言,我不是那个投反对票的人。 - wal
@wal - 它执行了删除和添加的操作。 - Oded
哪个不会破坏历史链? - wal
@wal:这里的重点是VS集成。如果您使用p4 move,Perforce将维护历史链接。但我敢打赌,ReSharper、P4SCC或其他重构工具不知道为重命名的文件调用该命令的足够信息。 - JasonMArcher
@Wal / Oded:TortoiseSVN有一个名为“fix rename”的命令,当一个文件被添加而另一个文件丢失时,在检入之前可以执行该命令。 - Schiavini
显示剩余2条评论

2
您可能想要查看 Git。与其他版本控制系统不同,它没有文件特定的限制,因为修订历史不依赖于特定命名的文件。每个提交都是先前代码的差异,与其中的文件无关。
如果需要与 Visual Studio 集成,您可以查看 Git Extensions。对于资源管理器 shell 集成,请参阅 TortoiseGit

它将整个存储库视为一个单元,因此单个文件甚至文件夹变得不那么重要。它无法告诉一个东西变成了另一个东西,只知道它们是不同的。如果您经常执行更新/提交和推送/拉取操作,历史记录基本上会被保留。 - Paul Sasik
那么,你如何追踪特定类的历史记录(例如)以找到它断掉的时间点? - jlew
1
这不是真的,Perforce可以很好地跟踪文件在重命名和移动过程中的修订。只需确保您使用的是2009.2或更高版本即可。 - aflat
1
我们最终转向了Git,在这种情况下表现得非常出色。事实证明,它在跟踪方面比Paul上面所说的要复杂一些。如果您在同一次提交中移动/重命名并修改文件,则在大多数情况下它仍将跟踪它(如果文件的某个特定百分比保持不变)。 - jlew
2
切换到另一个版本控制系统对于使用Perforce的人并没有帮助。 - Andy
显示剩余3条评论

2

新的Perforce插件P4VS在Visual Studio中更好地管理了移动/重命名文件。如果您尝试过P4SCC并感到失望,请尝试P4VS。我发现它在P4SCC无法做到的大多数情况下都做得很“对”。


谢谢。我们一段时间前转换到了Git(出于其他原因),它很好地解决了这个问题。 - jlew

1

从Perforce 2009.2版本开始,有一个p4 move命令。它并不完美,因为文件的历史记录仍然保留,但在p4v中选择一个文件夹时无法显示历史记录。


Perforce的移动/重命名在手动调用时会执行正确的操作,但我的情况涉及批量操作,这些操作是在Visual Studio中作为Resharper重构的结果发生的。 - jlew

1

您可以通过查看文件修订历史记录来查看完整的历史记录。

操作步骤如下: 1)进行重命名 2)右键单击并查看新命名文件的历史记录 3)它只显示当前版本,但是,如果您右键单击该版本并选择修订图,则可以查看具有删除/添加发生位置链接的完整历史记录。 4)您可以在图表上选择节点并执行差异以查看不同文件之间的更改。

这是一个额外的步骤,不太明显,但对我很有效。


0

如果您确实需要保留此信息,以下是一个复杂的解决方案:

  1. 使用Perfarce扩展创建Perforce仓库(或子部分)的Mercurial克隆。
  2. 安装VisualHg SCC插件,它是将Mercurial集成到VS中的工具。
  3. 进行重构 - 我相信VisualHg可以正确处理重命名。在手动重命名文件时,Visual Studio可以做到这一点,因此我认为Resharper也可以。
  4. 将更改从Mercurial推回Perforce。这应该包括您想要的正确的分支和删除(移动)操作。
请注意,我没有尝试过这个方法,因为我没有Resharper,但是Perforce->Mercurial->Perforce链接在Perfarce上运行良好,而VisualHg比我使用过的其他SCC插件要好得多。所以也许值得一试。您可以先快速尝试Resharper/VisualHg链接,如果成功了,再进行Perforce->Mercurial步骤。

0
  1. 不,据我所知没有。尝试联系Perforce支持。

  2. 我不会选择那个方向。

  3. 不是另一个源代码控制产品,但你可以尝试使用VS2P4代替P4SCC,它似乎可以与ReSharper的重命名类重构一起使用。我在一段时间前进行了转换,并且真的很喜欢它,尽管它有自己的怪癖。可以通过VS2010扩展管理器安装。


嗯,VS2P4看起来很有趣,但我在NuGet上找不到它。 - jlew
@jlew:抱歉,我的错。使用位于“工具”菜单下的VS2010扩展管理器。 - rjnilsson
尝试过了,看起来很有前途,但我的大型解决方案(70多个项目)在加载时卡住了。 - jlew
@jlew:嗯,这次尝试还是值得的。我建议你在Codeplex上留下一个错误报告。 - rjnilsson

0

VS宏

我编写了一个宏,用于将“p4 move -k”操作添加到Visual Studio的重命名事件中。 请参见{{link1:“如何在使用Perforce的Visual Studio中重命名文件时保留更改历史记录”的答案}}。

有了这个宏,您可以在Visual Studio中至少正确地重命名文件。
我认为不可能同时正确地重命名类和文件(例如ReSharper所做的那样),因为在一个更改列表中重命名和更改文件是不可能的。


0
我尝试使用ReSharper的上下文帮助“将文件重命名为类型名称”来使用VS2P4。但是...它不起作用。它显示对话框。

enter image description here

如果我点击“继续更改”,它确实会执行警告所说的操作。它会删除和添加文件,而不通知Perforce。只有项目文件被签出。


0

顺便提一下,今天发布的VS2P4版本1.74具有重大性能改进,特别是对于包含数千个文件的解决方案。


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