【问题标题】:How to disable or remove candidate changes in TFS如何禁用或删除 TFS 中的候选更改
【发布时间】:2017-07-28 10:36:36
【问题描述】:

当 tfs 工作区中的文件被移出 tfs(例如,通过 Windows 资源管理器)时,tfs 会将这些移动作为删除和添加进行选择。

为了解决这个问题,我运行了一个程序来监视更改,当发生移动时,我执行 Workspace.PendRename 并将 updateDisk 设置为 false。

这很好用,只是 tfs 将删除添加为候选更改。

有没有办法删除这个候选更改?如果人们试图推动这些变化,就会引发问题。

通过使用 Workspace.GetPendingChangesWithCandidates 我可以获得候选更改,但我似乎无法将其从列表中删除。

在执行 PendRename 之前,我尝试将文件移回其原始位置 (File.Move),然后在 updateDisk 设置为 true 的情况下执行 PendRename。这实际上适用于单个文件,但涉及文件夹等时会变得复杂。

我希望有一种简单的方法可以从列表中删除候选更改,或者甚至完全禁用某些文件/文件夹的候选更改功能。我尝试将文件夹添加到 .tfignore 文件中,但这不起作用。

Promote Candidate Changes shows deletes even though files were renamed

【问题讨论】:

  • 您使用的是本地工作空间吗?本地工作空间将监视磁盘上的更改,因此如果您将文件从工作空间内的一个目录移动到工作空间内的另一个目录,则会检测到移动。 TFS 中的移动是删除+添加,因此您描述的行为是有意的。如果您不希望工作区监视磁盘上的更改,请改用服务器工作区。本地和服务器工作区之间存在一些差异,如下所述:visualstudio.com/en-us/docs/tfvc/…
  • Sander,在 TFS 中,移动不是添加和删除,这会丢失所有文件历史记录。 TFS 中的移动称为重命名。
  • Patrick,工作空间内的文件在 TFS 不知情的情况下被移动,因此 TFS 将这些文件作为删除和添加进行选择。我希望 TFS 明白它实际上是一个移动/重命名。
  • @Zenix 这是正确的现象,当在源代码管理资源管理器之外进行重命名时,更改将被检测为两个单独的操作,一个删除一加

标签: c# api tfs


【解决方案1】:

在 TFS 中有两种移动文件。我已经为两者制作了一个样本:

本地工作区(window exploer)直接移动/拖动文件

  1. 在我的工作区磁盘中,我将把 2.PNG 移动到 Main-branch 文件夹

  1. 然后我们可以检查 TFS 在 VS 中检测到的内容。一个带有添加(在新 place),一个在“Promote Candidate Changes”中带有删除(在旧位置)。

  2. 您需要同时检查添加和删除(先升级)。最后 你会得到你想要的服务器和本地的。

直接在解决方案资源管理器中移动文件

  1. 在解决方案资源管理器中,我将把 1.PNG 移动到 Main 文件夹右键单击并选择移动。

  1. 您将直接获得具有 rename 状态的待处理更改,并且 没有任何促进候选人的变化。

  2. 然后我们可以检查我们的本地工作区,你会看到 1.PNG 是 在工作区文件夹中自动删除,即使您没有签入更改。最后检查未决 变化,一切都很好,很干净。


回到您的问题:Promote Candidate Changes 显示删除,即使文件已重命名

TFS API 应该使用上面的方式 2。看参数:

更新磁盘

如果为true,则根据挂起的更改更新本地磁盘; 如果为 false,磁盘不会被修改并且更改不会 承认

因此,如果您将 updateDisk 设置为 false ,则 1.PNG 应该仍然存在于磁盘中,并且 TFS 会检测到它并添加以促进候选更改显示已删除。符合您的屏幕截图。解决方案应该是将值从 false 更改为 true

【讨论】:

  • 我无法想象这可能是设计使然。看来它一定是一个错误,我正在尝试找到解决方法。也许我没有足够清楚地解释这个问题。我使用 Workspace.PendRename 重命名文件。这进入了我的待定更改。 TFS 然后将原始文件名的删除添加到我的候选更改中。因此,TFS 正在为丢失的文件添加候选删除,即使它知道该文件已被重命名。
  • @Zenix 正确重命名文件后,历史记录不会“消失”,而是与“旧名称”相关联。但是,当在源代码管理资源管理器之外完成重命名时,更改将被检测为两个单独的操作,一个删除一个添加。您可以使用“Pending Changes”窗口将这些升级为重命名,以便保留历史记录。
  • @Zenix 更多详情请看jessehouwing在这个问题stackoverflow.com/questions/28990323/…中的回答
  • 我需要以编程方式完成此提升。这就是我在 updateDisk 设置为 false 的情况下执行 PendRename 的原因。如果有更好的方法,那么我很想知道。如果有一个方法 PromoteAsRename(pendingDelete,pendingAdd) 会很完美,但是这样的功能似乎没有被 api 公开。这就是为什么我认为它是一个错误,TFS 知道该文件已被重命名,但仍为其添加候选删除。这就像告诉你妈妈你姐姐去了商店,然后她还是提交了一份失踪人员报告。
  • @Zenix 使用 c# API 移动 TFS 文件只需要 workspace.PendRename( oldPath, newPath );使用“workspace.GetPendingChanges()”和“workspace.CheckIn()”方法来完成。在您的情况下,您还需要检查您的“候选待定更改”(TFS 客户端已确定磁盘上存在的那些),然后首先将它们提升为实际的待定更改。要使用此提升以编程方式完成,Workspace.GetPendingChangesWithCandidates 是正确的方法检查stackoverflow.com/questions/24970734/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2020-10-09
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多