为什么 TFS 不能获得最新的信息?

为什么 TFS 不能持续获得最新的工作?

您可能会认为这个特性已经经过了彻底的测试。

我要做的是,得到特定的版本,然后检查两个覆盖可写文件 + 覆盖所有文件。

是我的本地设置搞砸了,还是你也这么做了?

108450 次浏览

TFS 重新定义了“ GetLatest”的作用。在 TFS 术语中,GetLatest 意味着获取文件的最新版本,但是忽略服务器认为已经存在于您的工作区中的文件。这对我和这个星球上的其他人来说都是错误的。

请看这个链接: http://blogs.microsoft.co.il/blogs/srlteam/archive/2009/04/13/how-get-latest-version-really-works.aspx

让它完成您想要的任务的唯一方法是获取具体版本,然后选中“ Overwrite...”框。

默认情况下,“获取最新版本”将只下载自上次运行“获取最新版本”以来在服务器上发生更改的文件。TFS 跟踪您下载的文件,因此它不会花时间再次下载相同版本的文件。如果您正在 VisualStudio 之外修改文件,这可能会导致您看到的一致性问题。

与其他一些源代码管理提供程序(如 Perforce)一样,TFS 也这样做,因为系统知道您成功获得的最后一个版本是什么,所以 get best 变成了“ get change since x”。如果你遵循它的规则,在编辑之前实际检查一下,你就不会把事情搞混了,而且“获取最新信息”确实如它所说的那样。

正如您所看到的,您可以强制它重新评估所有内容,这些内容具有更大的带宽使用量,但其行为更接近于 SourceSafe 过去的行为。

不幸的是,在 TFS 2008中必须有一个或多个 bug,因为这个问题经常出现在开发人员的机器上,并在我工作的地方构建服务器。

我可以使用 Get Latest,我可以在项目的历史列表中看到,在我上次使用 Get Latest 之后,我没有以任何方式碰过磁盘上的文件,但是在“ Get Latest”功能完成之后,当我检查 TFS 选项卡时,一些文件仍然说它们不是最新版本。

显然,TFS 能够确定我在本地有旧文件,因为列表是这么说的。然而,获取最新版本却无法做到这一点。如果我按照您所做的操作,使用“获取特定内容”版本,并选中对话框底部的两个复选框,那么文件将被检索到。

我们改变了我们的构建服务器,总是使用获取特定版本的功能类型,所以这一部分现在可以工作,但是因为我们的构建服务器(TeamCity)也依赖于检查文件是否有更改,以启动构建,有时它会陷入“没有更改,这里没有什么可看的,继续前进”模式,并且什么也不做,直到我们强制运行构建配置。

请注意,我曾经在一台从未被触及的机器上遇到过这个问题,除了获取最新 + build,都是手动的,因此没有任何对文件的篡改。只是 TFS 搞混了。

有一次,我验证了磁盘上的文件确实与以前检索到的版本是二进制的,因此没有对文件进行任何手动篡改。

此外,我看不到 TFS 如何“知道”文件在磁盘上是否已经更改,而不必实际查看内容。如果 TFS 的一部分可以看到文件确实不是最新版本,那么 Get Latest 版本应该完全能够获得最新版本。这里参考了对其他答案的评论。

有时 Get specific version 甚至可以同时检查两个复选框不会给你最新的文件。您可能已经对文件进行了更改,并希望通过重新获取最新版本来撤消这些更改。这就是 Undo pending changes的目的,而不是 Get specific version的目的。

如有疑问:

  • 撤消挂起的文件签入
  • 之后进行比较,以确保您的文件与预期的版本相匹配
  • 然后对整个项目进行递归“比较”,看看还有什么不同
  • 密切关注挂起的更改窗口,有时可能需要检查“采用服务器版本”来解决不兼容的挂起的更改

这个是我最喜欢的,我刚刚发现:

  • 留意 Output视窗内的讯息,例如:

    警告-无法刷新 R: TFS-PROJECTS www.Example.com ExampleMVC 示例 MVC 示例 MVC.csproj,因为您有一个挂起的编辑。

至关重要消息出现在输出窗口中。没有其他通知! 挂起的更改中没有任何内容,也没有其他对话消息告诉您刚才请求的文件未被检索!是的,您只需运行 Undo pending changes并获取文件就可以解决这个问题。

这可能是因为您作为相同的用户登录 TFS,并且工作区名称(默认情况下基于机器名称)也是相同的,所以 TFS 认为您在相同的机器和相同的工作区上,因此您已经有了最新版本的文件,所以它不会为您获得它们。

尝试重命名您的机器,并创建一个新的工作区作为一个新的机器。

我所看到的大多数开发人员抱怨 Get Latest 没有做到他们所期望的事情的问题都源于这样一个事实,即他们正在从解决方案资源管理器而不是源代码管理资源管理器中执行 Get Latest。解决方案资源管理器只获取作为解决方案一部分的文件,并忽略解决方案中的文件可能需要的任何内容,因此是源代码管理的一部分,而源代码管理资源管理器将您的本地工作区与服务器上的存储库进行比较,以确定需要哪些文件。

TeamFoundationServer (TFS)在一个名为 $TF. 的隐藏目录中跟踪其本地副本。当您发出“获取最新版本”时,TFS 查看该文件夹并查看是否有最新副本。如果它这样做,它将不会下载最新的副本。你有没有原始文件并不重要。实际上,您可能已经删除了整个文件夹(就像我的情况一样) ,TFS 不会获取最新的副本,因为它不会查看实际文件,而是查看记录更改的隐藏目录。这种设计的缺陷是,系统外的任何操作都不会记录在 TFS 中。例如,你可能进入文件资源管理器,删除一个文件夹或文件,TFS 不会识别它。这将是完全盲目的。至少我希望 Windows 不会让你删除这个文件,但它做到了!

强制执行最新副本的一种方法是手动删除隐藏的 $TF 文件夹。为此,转到命令提示符并导航到签出项目的根文件夹,然后发出此命令

rd/s $tf                    // remove $TF folder and everything inside it

如果你只想检查隐藏文件夹,你可以使用

dir /ah                    // display hidden files and folders

注意: 如果您这样做了,tf 将认为您没有任何本地副本,即使您在文件中有它,它将再次同步所有内容。

注意: 使用此方法的风险自负。请不要在关键工作中使用它。

只想添加 TFS MSBuild 不支持文件夹上的特殊字符,即“@”

我曾经经历过我们的一个项目文件夹命名为外部@Project1

我们创建了一个 TFS Build 定义来运行一个自定义的 msbuild 文件,然后工作区文件夹在工作区获取最新消息期间没有获取外部@Project1文件夹中的任何内容。似乎 tfs get 失败了,但是没有显示任何错误。

经过一些尝试和错误,并将文件夹重命名为 _ Project1. 瞧,我们得到了文件夹(_ Project1)上的文件。

当我遇到这个问题,它没有得到最新的和版本不匹配,我首先做一个“获取特定版本”设置为变更集,并放入1。然后,这将删除所有的文件从您的本地工作区(为该项目,文件夹,文件等) ,它也将有 TFS 更新,以便它知道您现在没有版本下载。然后你可以做一个“获取最新”和中提琴,你实际上会有最新的

我对 VisualStudio2012也有同样的问题。不管我怎么做,它都没有从 TFS 源代码控制中获得代码。

在我的例子中,原因是从源代码管理分别映射一个文件夹 + 子文件夹,但是在我的本地 HD 中映射到同一个树。

解决方案是使用“管理工作区”窗口删除子文件夹映射。

当您从两台不同的机器使用同一帐户的 TFS 时,可能会发生这种情况,如果是这样,您应该比较看到更改的文件并签出它们,然后获取最新的文件,然后撤销挂起的更改以删除签出

如果没有例子说明它是如何失效的,那么很难对语句做出响应,但是理解 TFVC (在“ Server Workspace”模式下,这是 TFS 2012之前的机制) 不检查本地文件系统的状态是至关重要的。TFVC 服务器工作区是一种“签出-编辑-签入”类型的系统,它是按设计进行的,是为了大量减少确定工作区状态所需的文件 I/O 数量而有意做出的决定。相反,工作区信息保存在服务器上。

这使得 TFVC 服务器工作区可以非常有效地扩展到 非常大型代码库。如果你使用的是几 GB 的代码库(比如 Visual Studio 或者 Windows 源代码树) ,那么你的客户端不需要扫描你的本地文件系统,寻找可能已经更改的文件,因为你和 TFS 的协议是当你想编辑一个文件的时候你会显式地签出它。

您需要将 没有标记为只写文件,并在不显式检出该文件的情况下对其进行更改。如果您沿着这条路线走,那么服务器不知道您已经对文件进行了更改,并且执行“ Get Latest”操作将 没有更新您的本地工作区,因为您没有告诉服务器您已经进行了更改。

如果您使用 颠覆这种机制,那么您可以使用 tfpt reconcile命令来检查您的本地工作区,以查看您在本地所做的更改。

如果你发现自己在使用“获取特定版本”并选择“强制”和“覆盖”选项,那么很可能你已经习惯于绕过 TFS 已经实现的所有强制措施来防止你伤害自己,你可能应该考虑 TFVC 本地工作区。

TFVC 本地工作区提供了一种“编辑-合并-提交”类型的版本控制系统,这意味着在编辑文件之前,不要需要显式地检出它们,并且它们是 不是只读磁盘。相反,您只需编辑文件,客户机将扫描文件系统,注意到更改,并将其显示为挂起的更改。

TFVC 本地工作区 建议适用于不需要细粒度权限控制的小型项目,因为它们提供了更好的工作流。您不需要联机,也不必在编辑文件之前显式签出文件。

TFVC 本地工作区是 TFS 2012中的默认设置,如果没有为您启用它们,那么您应该询问服务器管理员。(具有非常大的代码库或严格的审计要求的组织可能会禁用 TFVC 本地工作区。)

Eric Sink 的优秀著作 < em > 例子版本控制概述了 checkout-edit-checkkin 和 edit-merge-commit 系统之间的区别,以及什么时候一个系统比另一个更合适。

< em > 专业 TeamFoundationServer 2013 书还提供了关于 TFVC 服务器工作区和 TFVC 本地工作区之间的差异的极好的信息。MSDN 文档和博客还提供了详细信息:

工具: TFS 电动工具

来源: Http://dennymichael.net/2013/03/19/tfs-scorch/

Tfpt 焦点/递归/删除 C: LocationOfWorkspaceOrFolder

这将打开一个对话框,要求您删除或下载文件列表。相应地选择或取消选择文件并按 OK。网格中的外观(CheckBox、 FileName、 FileAction、 FilePath)

原因: TFS 将只与工作区中的项进行比较。如果在工作区之外进行了更改,TFS 将不会察觉。

希望有人觉得这个有用。我发现这篇文章删除了不同位置的一些文件夹。不记得我删除的文件夹排除了通常的强制获取/替换选项,我会使用。

这对我很有效:
1. 退出 Visual Studio
2. 打开命令窗口并导航到文件夹: “% localappdata% LocalMicrosoftTeamFoundation”
导航到每个版本的子文件夹并删除子文件夹“ cache”及其内容
4. 重新启动 VisualStudio 并连接到 TFS。
5. 测试获取最新版本。 < br >

在我的例子中,获取特定版本,即使同时选中复选框和撤消所有挂起的更改也不起作用。

检查工作空间。编辑当前工作空间。检查所有路径。 解决方案路径不正确,指向的是已删除的文件夹。

固定的路径,并得到最新的工作罚款。

右键点击: 高级 > 获取特定版本,选择“最新版本”,现在,重要的是,标记两个选项: enter image description here

这些支票是:
覆盖未检查的可写文件

即使本地版本与指定版本匹配,也要覆盖所有文件

每次发生这种情况(到目前为止) ,都是因为在。Csproj 项目文件。该文件似乎保存了项目中包含的所有文件的列表。其他人添加的任何新文件都是“未下载”的,因为它们不在我的本地编辑(现在已经过时)的项目文件中。若要获取所有文件,首先必须撤消对。Csproj 文件,然后“获取所有”。我不需要撤销已经做过的其他更改,但是我可能需要返回并再次包含我的新文件(然后下一个人在尝试“获取所有”时会遇到同样的问题...)

在我看来,当多个人同时添加新文件时,存在一些基本的混乱现象。

(这是在.Net Framework 项目中,也许其他框架如 Core 的行为不同)

我遇到了同样的问题:

我的开发服务器损坏并恢复了,但恢复的信息是几天前的。

TFS 被更新,所有的文件是最新的,但在实践中,我的文件是正确的前几天!

没有我做的帮助。得到最新的没有得到最新的版本。

最后我得到了一个月前的具体版本。我的文件也相应地更新了,然后我得到了最新的。

成功了,文件被更新了。