在 TFS 2013 中移动文件会丢失历史记录

Moving files lose history in TFS 2013

我将 VS2013 Update 4 与 TFS 2013 Update 4 一起使用。在源代码管理资源管理器中,每当我将文件从一个文件夹移动到另一个文件夹时,我都可以看到文件的历史记录保存在新位置。但是,当我签入挂起的更改时,该历史记录就消失了。当我尝试 运行 "tf move" 命令时,也会发生同样的事情。那么,如何在 TFS 中移动文件并仍然保留文件的历史记录?

我从这个 question.

来到这个问题

该问题自 TFS2010 以来就存在,并且不仅是重命名或移动文件的问题,也是重命名或移动文件夹的问题。 最糟糕的是,如果您重命名分支然后查看文件夹历史记录。然后你只会找到你的重命名变更集。

Here可以看到MS对这个任务的反应。基本上他们说他们没有这样做,因为它需要大量工作并且会使历史变慢。

我无法接受这个事实并为此编写了一个修复程序。递归历史选择发生在 SP dbo.prc_QueryHistory 中。我更改了 SP 并添加了以下功能:

  • (递归地搜索最后 256 个变更集)
  • 然后检查变更集是否代表 rename/move 操作
  • 如果如此递归地(在循环中)跟随每个 rename/move 到其以前的 ItemId 并重复此步骤(以防 file/folder 被多次重命名)
  • 然后找到以前 ItemId 的所有先前变更集(moving/renaming 更改 ItemId)
  • 将新找到的变更集添加到变更集列表,并在第 256 行剪切

结果是历史记录速度较慢(尤其是如果您在深层文件夹树的根目录下执行此操作),但问题已解决。我宁愿生活在缓慢的历史中,也不愿生活在不完整的历史中。

我可以向您提供我编写的 SP,但我不确定是否允许我在此处发布它,因为它包含受 MS 保护的代码。 (当然,我不能保证在更新系统时修复会持续存在。-我在 TFS 2013 SP3 上编写了我的 SP。)

更新: 我请求 MS 允许发布我的修复(我的 post 中的第二个 link)

正确重命名文件后,历史记录不会“消失”,而是关联到“旧名称”。以正确方式完成的重命名(跟踪为重命名而不是删除+添加)有一个向下钻取选项来查看“较旧”的历史记录:

  • 变更集 81~82 包含对旧名称的变更
  • 变更集 83 包含删除 + 重命名
  • Changeset 84 重命名后签入的新更改

当在源代码管理资源管理器之外(或从非常旧版本的源代码管理资源管理器(例如 VS 2008))或在解决方案资源管理器之外完成重命名时,更改将被检测为两个单独的操作, 一个 delete 和一个 add.您可以使用“待定更改”window 将这些升级为重命名,以便保留历史记录:

在命令行上,这只能使用“tf rename”和“tf move”来完成。使用标准的“mv”和“ren”命令将无法保留历史记录。

下面是使用所有不同方法的进一步示例,并通过查看当前文件名的历史记录清楚地表明保留了历史记录:

如评论中所述,历史记录存储在包含项目修订的团队项目中。当 branching/moving 跨项目时,您的历史记录将分布在这些项目中。如果您删除团队项目,那么该项目中积累的所有历史记录都将丢失。

我认为 jessehouwing 修复不适用于文件夹。事实上,如果您使用 VS 2012+ 的源代码管理资源管理器,文件夹的移动会保留文件历史记录(在 VS 中显示递归),但不会保留文件夹。文件夹历史是平的。

这个问题的解决方案:

  1. Microsoft 将修复文件夹历史记录在 VS 中的显示方式或添加“显示递归历史记录”上下文菜单项。
  2. 将所有变更集从一个文件夹迁移到另一个文件夹。不幸的是,我仍然无法确定能够为 TFS 2013 或 VSO 执行此操作的工具。

请查找我的tf move经验

TFS 中有 main 个分支。我在与 main 相同的层次结构级别上创建了 main-rest。然后我尝试将 main-rest 移动到另一个子文件夹(将实验分支从 $ root 移动到 subfoler.

我已经删除了本地文件夹映射并执行了

tf move $/projectName/main-rest $/projectName/experimental/main-rest

该命令在输出中列出了分支中的所有文件。然后我提交了更改。

看起来不错,但是 * 不再有分支文件夹历史记录 * 合并没有看到要合并的变更集

有可能在移动之前从 main-rest 合并到 main 分支。它仍然可用,但合并时 select 没有变更集。

"merge selected changeset only" 选项中只有一个 "moved" 变更集。它发生在 main-rest 移动到 experimental 子文件夹后。

我希望可以合并整个master-rest分支(但现在不是测试的时候)

我使用了 VS2017 附带的 tf.exe 命令行实用程序(使用今天可用的最新更新进行了修补)。源码托管在云端tfs(https://dev.azure.com)

此致