为什么TFS的“获取最新版本”没有获取到最新版本?

185

TFS的获取最新版本为什么不可靠?

你会认为这个功能已经经过了充分的测试。

我所需要做的是获取指定版本,然后检查覆盖可写文件和覆盖所有文件两个选项。

是我的本地设置出了问题还是你也要这样做?


我看到的最愚蠢的事情是,“获取最新版本”即使本地文件因为任何原因被删除,也毫无作用。我本以为至少检查本地文件是否存在是一件非常明显的事情。但为什么它不能只是比较服务器上每个文件的时间戳与您上次获取的时间(可以存储在本地某处),这让我感到困惑。 - Dylan Nicholson
这应该是一条注释。 - Jimenemex
这是2020年9月。我和大多数人一样,来到这里是为了同一个原因。最新版本并不是最新的。我删除整个解决方案文件夹!关闭VS,清空bin,重新启动手机。从TFS源代码控制资源管理器中打开sln文件。但仍然会出现文件和项目无法工作/缺少文件的情况。 - Christian
19个回答

123

8
这不正确。只要TFS知道文件的更改,TFS的“获取最新版本”功能就能像广告宣传的那样正常工作。只有当人们在未首先签出文件的情况下在IDE之外修改文件时,“获取最新版本”才会出错。此时,TFS认为您已经拥有了最新的源代码,并且不会再次获取它。 - Robaticus
20
@Robaticus,TFS的“获取最新版本”功能到底是怎么广告的?就像Chris Lively之前说的那样,他和全世界的人都理解“获取最新版本”是指获取最新版本,但这不是TFS所能做的。你不需要在TFS外部编辑源代码就能搞砸它。我有两台工作站,可以互相切换工作,但就是同步不了源代码。在TFS中获取最新版本已经很麻烦了,我无法想象合并会是什么样子。 - Syaiful Nizam Yahya
2
@publicENEMY,我曾经在两台机器上使用TFS工作,确实同步源代码是个问题。你可能需要两个TFS用户来解决这个问题... - kroiz
11
呃!这真是令人头疼。Visual Studio很容易出问题,有时在文件系统上修复它是最简单的方法。其他源代码管理系统(SCM)如Subversion具有Windows资源管理器钩子,而且其VS集成能更好地监视更改。我想念SVN! - Dan Csharpster
4
我同意作者的观点。我把“获取最新版本”理解为“从服务器获取最新版本”(否则我会从哪里获取它呢?)。在VS2010中,我执行“获取最新版本”,告诉我已经有了最新版本,但如果我进行比较,它会列出本地和最新服务器版本之间的差异。我不介意它不覆盖本地工作,但至少应该进行时间戳比较,并且不要误导我说“您已经拥有了最新版本”。当我删除本地版本时,“获取最新版本”按预期工作。 - Swanny
显示剩余8条评论

44
有时候即使勾选了两个复选框,使用“获取特定版本(Get specific version)”也不能获取到最新的文件。你可能对某个文件进行了更改,并想通过重新获取最新版本来撤销这些更改。那么...这就是“撤消挂起的更改(Undo pending changes)”的用途,而不是“获取特定版本(Get specific version)”的目的。
如果有疑问:
- 对文件执行待检入操作 - 之后进行比较,以确保文件与预期版本匹配 - 之后在整个项目上运行递归“比较”以查看其他不同之处 - 留意待处理更改窗口,有时您可能需要选中“采用服务器版本(take server version)”以解决不兼容的挂起更改
我刚刚发现的一个最喜欢的技巧是:
- 在“输出(Output)”窗口中注意此类消息:
警告 - 无法刷新 R:\TFS-PROJECTS\www.example.com\ExampleMVC\Example MVC\Example MVC.csproj,因为您有一个待处理的编辑。
这条关键消息会显示在输出窗口中。没有其他通知!没有待处理更改中的任何内容,也没有其他对话框消息告诉您刚刚明确请求的文件未被检索!是的-您只需运行“撤消挂起的更改(Undo pending changes)”并获取文件即可解决此问题。

谢谢,您的答案(“撤销待处理更改”)对我有帮助。 - Ramin Bateni
请确保只撤销您想要替换的文件上的更改,而不是您正在处理的所有内容。 - Simon_Weaver
@Simon_Weaver 谢谢,这解决了我的问题,虽然明白为什么会发生,但仍然非常恼人。 - nulltron

13

TFS和其他一些源代码控制提供商(例如Perforce)也是这样做的,因为系统知道您成功获得的上一个版本是什么,所以“获取最新版本”变成了“获取自x以来的更改”。如果您遵守其规则并在编辑之前实际检查事物,就不会混淆问题,“获取最新版本”确实可以按照其说法执行。

正如您所看到的,您可以强制它重新评估所有内容,这将产生更大的带宽使用量,但行为更接近SourceSafe的行为。


12

很难对一种没有给出它不起作用示例的语句做出回应,但重要的是要理解在TFS 2012之前使用的TFVC(以"Server Workspace"模式为机制)不会检查您本地文件系统的状态。TFVC Server Workspaces是一种“签出-编辑-签入”类型的系统。因为这是按设计意图实现的,故意做出的决定,旨在大量减少确定工作区状态所需的文件I/O数量。相反,工作区信息保存在服务器上。

这使得TFVC Server Workspaces能够非常高效地扩展到非常大的代码库。如果您正在使用多GB级别的代码库(例如Visual Studio或Windows源代码树),则客户端无需扫描您的本地文件系统,寻找可能已更改的文件,因为您与TFS的契约是,您将明确地签出一个文件以进行编辑。

您需要将文件标记为只写,并在明确签出之前进行更改。如果您沿着这条路走下去,那么服务器就不知道您已经对文件进行了更改,执行“获取最新版本”操作将不会更新您的本地工作区,因为您没有告诉服务器您已经进行了更改。

如果您确实规避了此机制,则可以使用tfpt reconcile命令检查您在本地进行的更改。

如果您发现自己使用“获取特定版本”并选择“强制”和“覆盖”选项,那么很可能您已经养成了绕过TFS实施的所有执法措施的习惯来避免自己受伤,那么您应该考虑使用TFVC Local Workspaces。

TFVC本地工作区提供了一种“编辑-合并-提交”类型的版本控制系统,这意味着您在编辑文件之前不需要显式地检查文件,其在磁盘上也不是只读的。相反,您只需要编辑文件,客户端将扫描文件系统,注意到更改,并将其呈现为待处理更改。

对于不需要精细权限控制的小型项目,建议使用TFVC本地工作区,因为它们提供了更好的工作流程。您不需要联机,也不必在编辑文件之前明确检查文件。

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

Eric Sink的优秀著作Version Control By Example概述了检出-编辑-签入和编辑-合并-提交系统之间的差异,以及何时使用哪个更合适。

书籍Professional Team Foundation Server 2013也提供了关于TFVC服务器工作区和TFVC本地工作区之间差异的优秀信息。MSDN文档和博客还提供了详细信息:

  • 团队基础架构服务器:理解服务器工作区与本地工作区

  • 很棒、富有信息性的回答,但我不确定“将文件标记为只写”是否回答了OP的问题。 我知道我正在使用Visual Studio(现在是2013年)对MVC .NET项目中的*.cs文件进行所有更改,并且当我启动笔记本电脑时,“Get Latest”经常让我等待到我几乎要盲目地执行“高级>>>获取特定>>>最新>>>覆盖”的程度。没有在VS之外的编辑或签入。 VS找到我编辑过的文件并将它们正确地放入待处理更改中。 我用VS签入它们。 我看不到任何会“伤害自己”的东西,但Get Latest不能可靠地工作。?? - ruffin
    @ruffin 你是说获取最新版本会卡住吗?这不是我理解原帖问题的意思。它是否有完成呢?其他操作也很慢,还是只有获取最新版本慢?覆盖获取是否也很慢,还是只有通常的获取最新版本慢? - Edward Thomson
    不,它不会挂起。我可以获取最新版本,而且它似乎工作正常(并且相当快),但是文件没有更改。如果我执行获取特定 >>> 最新版本 >>> 覆盖,就像@NotMe建议的那样,文件就会“追上来”。可能是误导:也偶尔发生在Shelfsets中。是的,我的工作路径是正确的,否则获取特定版本就不会起作用,我不这么认为。 - ruffin
    我这里没有一个好的建议。如果您有一个长期存在的问题,认为可能是一个错误,请联系支持部门。无论这是否是一个错误,您都应该解决这个问题。 - Edward Thomson

    6
    团队基础设施服务器(TFS)会在名为$TF的隐藏目录中跟踪其本地副本。当您发出“获取最新版本”命令时,TFS会查看此文件夹并检查我是否拥有最新的副本。如果是,则不会下载最新的副本。事实上,您可能已经删除了整个文件夹(就像我的情况一样),但是TFS不会获取最新的副本,因为它不是查看实际文件而是记录更改的隐藏目录。这种设计的缺陷在于,系统外部的任何操作都不会记录在TFS中。例如,您可以进入Windows资源管理器,删除文件夹或文件,但TFS将无法识别它。它将完全失效。至少我希望Windows不会让您删除该文件,但它确实可以!

    强制获取最新副本的一种方法是手动删除隐藏的$TF文件夹。要这样做,请转到命令提示符并导航到您的项目被检出的根文件夹,并发出此命令。

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

    如果您只想检查隐藏文件夹,可以使用以下方法进行操作:
    dir /ah                    // display hidden files and folders
    

    注意:如果你这么做了,tf 将认为你没有本地副本,即使在文件中有副本,它也会重新同步所有内容。
    注意:请自行决定是否使用此方法。请勿在重要工作上使用。

    这个方法在其他方法都无效时对我很有用。我尝试了获取特定版本并勾选两个复选框以强制下载,但那样并不能获取文件。我认为可能是某些文件损坏了。但这个解决方案有效。 - Francisco d'Anconia

    3

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

    这两个选项是:
    覆盖非检出的可写文件

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


    请描述需要检查的项目,而不是发布截图。 - Chuck Adams
    兄弟.. 这里的每个人都在谈论这个覆盖。正是这种方法让我们无法信任。 - Christian

    3

    默认情况下,“获取最新版本”仅会下载与上次运行“获取最新版本”时在服务器上更改的文件。TFS会跟踪您下载的文件,以便不会重复下载这些文件的相同版本。如果您在Visual Studio之外修改文件,这可能会导致一些一致性问题,就像您所遇到的问题一样。


    告诉我们如何重置这个[上次更改的]信息;而不是告诉我们已经知道的 :) 而且您已经帮助OP解决了其他人无法解决的问题。 - Christian

    3
    很不幸,TFS 2008中存在一个或多个错误,因为在我工作的开发人员机器和构建服务器上定期出现此问题。
    我可以获取最新版本,我可以在项目的历史记录列表中看到我上次获取最新版本后已经提交了更改,我没有以任何方式触摸磁盘上的文件,但是在“获取最新版本”功能完成后,当我检查TFS选项卡时,有些文件仍然显示它们不是最新版本。
    显然,TFS能够确定我本地有旧文件,因为列表是这样说的。然而,获取最新版本未能获取最新版本。如果我像你一样使用“获取特定版本”并检查对话框底部的两个复选框,则会检索文件。
    我们将我们的构建服务器更改为始终使用“获取特定版本”类型的函数,因此此部分现在可以正常工作,但由于我们的构建服务器(TeamCity)还依赖于检查文件是否有更改以启动构建,因此有时会陷入“没有更改,没有东西可查看,继续前进”的模式,并且除非我们强制运行生成配置,否则不执行任何操作。
    请注意,我曾经在从未接触过的计算机上体验过这个问题,除了手动获取最新版本+构建之外什么也没做,因此没有任何东西会篡改文件。这只是TFS变得混乱了。
    有一次出现这种情况,我验证了磁盘上的文件确实与先前检索的版本二进制相同,因此没有手动篡改文件。
    此外,我无法理解TFS如何“知道”磁盘上的文件是否已更改,而不实际查看内容。如果TFS的某个部分确实可以看到文件不是最新版本,则获取最新版本绝对应该能够获取最新版本。这是对其他答案的评论的参考。

    TFS 依赖于文件版本号来确定您是否拥有“最新”的版本。该数字完全由 TFS 维护,并且仅在某人进行检入时更新。因此,当您“获取最新版本”时,TFS 会检查其数据库以查看发送给您的最后一个版本是什么。如果此数字等于当前版本,则它认为您拥有最新版本;而不管实际上在您的本地文件系统中是什么。这个想法是为了限制网络流量。不幸的是,这种模型能够工作的唯一方式是所有编辑都发生在具有 TFS 知识的应用程序内部。 - NotMe
    此外,我同意2005/08版本中至少存在一个错误。我在多台机器上看到了你描述的确切问题,这也是我一直坚持使用“获取特定版本”的原因。 - NotMe
    在某些情况下,编辑完全在一个机器上的Visual Studio中进行,另一台机器的唯一目的是获取最新版本并构建,从未进行本地更改。然而,它仍然会出错。我对TFS源代码控制并不感到满意。希望2010年能减少这些问题。 - Lasse V. Karlsen

    3
    可能是因为您使用相同的用户登录了TFS,并且工作区名称(默认情况下基于机器名称)也相同,因此TFS认为您正在同一台计算机上并且在同一个工作区中,因此您已经拥有文件的最新版本,因此它不会为您获取它们。
    尝试将计算机重命名,并创建一个新的工作区作为新计算机。

    2

    我在使用Visual Studio 2012时也遇到了同样的问题。无论我做了什么,它都无法从TFS源代码控制获取代码。

    在我的情况下,原因是将文件夹+子文件夹分别映射到本地硬盘上相同的树中。

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


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