为什么TFS不更新就获取最新?


177

为什么为什么TFS不能始终如一地获得最新成果?

您可能会认为该功能已经过全面测试。

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

我的本地设置搞砸了还是您也这样做?


我看到的最愚蠢的事情是,即使出于任何原因删除了本地文件,“获取最新版本”也不会执行任何操作。我本来以为检查本地文件至少存在是一件很明显的事情。但是,为什么不能仅将服务器上每个文件的时间戳与上次获取文件的时间(可以存储在本地)进行比较,这让我感到困惑。
Dylan Nicholson 2015年

这应该是一条评论。
Jimenemex

Answers:


118

TFS重新定义了“获取最新”功能。用TFS术语来说,“获取最新”意味着获取文件的最新版本,但是忽略服务器认为已经在您的工作空间中的文件。对我以及地球上其他所有人而言,这是错误的。

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

使其执行所需操作的唯一方法是获取特定版本,然后选中两个“覆盖...”框。


7
这是不对的。只要TFS知道文件的更改,TFS“获取最新”的功能就与广告中所宣传的完全一样。当人们外出并在IDE外部修改文件而无需先检出它们时,“仅获取最新消息”是“麻烦”。然后,TFS认为您在磁盘上拥有最新的源,而没有得到它。
Robaticus 2010年

18
@Robaticus tfs如何真正“宣传最新”广告。就像克里斯·莱弗里(Chris lively)之前说过的那样,他和地球上的每个人都知道“获取最新”获取最新版本,这不是tfs会做的。您无需在tfs之外编辑源代码即可将其弄乱。我有2个工作站,可以互换工作,我无法同步源。获得最新版本已经是tfs的麻烦,我无法想象合并会是什么样子。
Syaiful Nizam Yahya 2013年

2
@publicENEMY,我曾经在两台机器上使用tfs,但确实是源同步的问题。为此,您可能需要两个tfs用户...
kroiz 2013年

11
啊! 真痛苦 Visual Studio容易弄乱,有时将其修复在文件系统上是最简单的方法。其他源代码控制系统(例如Subversion)也具有Windows资源管理器挂钩,并且与VS集成都可以更好地监视更改。我想念SVN!
Dan Csharpster 2013年

3
我同意作者的观点。我将“获取最新版本”读为“从服务器获取最新版本”(我还要从哪里获取?)。在VS2010中,我做了“获取最新版本”并告诉我拥有最新版本,但是如果进行比较,它将列出本地版本和最新服务器版本之间的差异。我可以不覆盖本地工作,但可以,至少应该进行时间戳比较,并且不要误导我“您拥有最新版本”。当我删除本地版本时,“获取最新版本”按预期工作。
斯瓦尼2015年

42

有时Get specific version 即使选中两个复选框也无法获取最新文件。您可能已对文件进行了更改,并想通过重新获取最新版本来撤消那些更改。嗯...这Undo pending changes是目的,而不是目的Get specific version

如果有疑问:

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

这是我刚刚发现的最喜欢的东西:

  • Output窗口中留意以下消息:

    警告-无法刷新R:\ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj,因为您有待处理的编辑。

重要消息出现在输出窗口中。没有其他通知!未完成的更改中没有任何内容,也没有其他对话框消息告诉您未检索到您明确请求的文件!是的-您只需运行Undo pending changes并获取文件即可解决此问题。


谢谢,您的答案(Undo pending changes)对我有用。
RAM

只要确保只撤消您真正要替换的文件上的更改,而不是您正在处理的所有内容,就可以
撤消

@Simon_Weaver谢谢你,这解决了我的问题,但是为什么它仍然超级烦人是有道理的。
nulltron

12

TFS像其他一些源代码控制提供程序(例如Perforce)一样,执行此操作,因为系统知道您成功获取的最后一个版本是什么,因此,获取最新版本将变成“从x开始获取更改”。如果您遵循其规则并在编辑它们之前先进行检查,那么您就不会感到困惑,并且“获取最新信息”确实如它所说。

如您所见,您可以强制它重新评估所有内容,这具有更大的带宽使用率,但其行为与SourceSafe过去的行为更接近。


11

没有示例的工作方式就很难做出回应,但是了解TFVC(处于“服务器工作区”模式,这是TFS 2012之前的机制)不检查本地文件系统的状态至关重要。TFVC Server工作区是一种“签出-编辑-签入”类型的系统,这是设计使然,这是有意做出的决定,旨在大量减少确定工作区状态所需的文件I / O数量。而是,工作区信息保存在服务器上。

这使TFVC Server工作区可以非常有效地扩展到非常大的代码库。如果您使用的是数千兆字节的代码库(例如Visual Studio或Windows源代码树),则您的客户端不需要扫描本地文件系统,就可以查找可能已更改的文件,因为与TFS签订的合同是当您要编辑文件时,它将显式签出文件。

不应将文件标记为只写并更改它,而不先显式地检出它。如果沿着这条路线走,则服务器将不知道您已对文件进行了更改,并且执行“获取最新”操作不会更新您的本地工作区,因为您尚未告知服务器已完成操作变化。

如果确实破坏了此机制,则可以使用该tfpt reconcile命令检查本地工作区中是否有在本地进行的更改。

如果您发现自己使用“获取特定版本”并选择“强制”和“覆盖”选项,则很可能习惯于绕过TFS实施的所有强制措施,以免伤害自己,并且您可能应该考虑使用TFVC本地工作区。

TFVC本地工作区提供一个“编辑-合并-提交”类型的版本控制系统,这意味着您的并不需要显式地签出文件进行编辑之前,他们只读磁盘上。相反,您只需要编辑文件,客户端就会扫描文件系统,注意到更改,并将其显示为挂起的更改。

对于不需要细粒度权限控制的小型项目,建议使用 TFVC本地工作区,因为它们提供了更好的工作流程。您不需要处于在线状态,并且在编辑文件之前不必显式地检出文件。

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

Eric Sink的出色著作《示例控制版本》概述了签出-编辑-签入和编辑-合并-提交系统之间的差异,以及哪一种系统比另一种系统更合适。

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


很好的,很有帮助的答案,但是我不确定“将文件标记为只写”会回答OP。我知道我正在使用Visual Studio(现在为2013)对MVC .NET项目中的* .cs文件进行所有更改,并且当我启动笔记本电脑时,“获取最新信息”常常使我无法自拔现在几乎要进行“高级>>>获得特定>>>最新>>>覆盖”的货物培训。VS外部没有任何编辑或签入。VS会找到我编辑过的文件,并将其正确放入“待更改”中。我用VS检查它们。我看不到任何会“伤害自己”的东西,但是获取最新消息无法可靠地工作。??
鲁芬2015年

@ruffin你是说获得最新挂起?那不是我解释OP的问题。它完成了吗?是其他操作缓慢还是仅仅是Get?获取带覆盖功能的速度变慢还是仅仅是获取最新的?
爱德华·汤姆森

不,不会挂起。我可以获取最新消息,它似乎可以正常工作(并且可以很快地工作),但是文件没有变化。如果我确实获取特定>>>最新>>>覆盖,就像@NotMe建议一样,文件将“赶上”。可能是红色鲱鱼:架子架上也偶尔发生。是的,我的工作路径是正确的,否则我不相信“获取具体信息”将不起作用。
鲁芬2015年

我在这里没有很好的建议。如果您有一个长期存在的问题(可能是一个错误),希望您能与支持人员联系。无论这是不是bug,您都应该解决此问题。
爱德华·汤姆森2015年

6

Team Foundation Server(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会认为您没有任何本地副本,即使您已将其保存在文件中,它也会再次同步所有内容。

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


当我什么都没做时,这对我有用。我尝试获取特定版本,并选中了两个复选框以强制下载,但无法获取文件。我认为有些东西已损坏。但是此解决方案有效。
弗朗西斯科·德安科尼亚'16

3

默认情况下,“获取最新版本”将仅下载自上次运行“获取最新版本”以来服务器上已更改的文件。TFS会跟踪您下载的文件,因此不会花费时间再次下载相同版本的文件。如果要在Visual Studio外部修改文件,这可能会导致听起来像您看到的一致性问题。


3

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

我可以执行“获取最新”,我可以在项目的历史记录列表中看到上次执行“获取最新”后已经提交过,没有以任何方式接触磁盘上的文件,但是在“获取最新”功能之后完成后,当我检查“ TFS”选项卡时,某些文件仍然显示它们不是最新版本。

显然,TFS可以确定我在本地有旧文件,因为列表中是这样的。但是,获取最新版本无法做到这一点,无法获取最新版本。如果我执行了您的操作,请使用“获取特定版本”,并选中对话框底部的两个复选框,然后将检索文件。

我们将构建服务器更改为始终使用“获取特定版本”功能类型,因此这部分现在可以正常工作,但是由于构建服务器(TeamCity)还依赖于检查文件是否已更改才能启动构建。 ,有时会变成“什么都没有改变,这里什么也看不到,继续前进”模式,并且在我们强制运行构建配置之前什么也没做。

请注意,我在从未动过的机器上遇到了此问题,除了手动获取最新+生成版本外,因此不会篡改文件。只是TFS感到困惑。

有一次,我验证了磁盘上的文件确实与以前检索的版本完全相同,因此没有对文件进行手动篡改。

另外,我看不到TFS如何在不实际查看内容的情况下“知道”磁盘上的文件是否已更改。如果TFS的一部分可以看到文件确实不是最新版本,则“获取最新版本”应该绝对能够获取最新版本。这是参考此处其他答案的评论。


TFS取决于文件版本号,以了解您是否具有“最新”版本。该数字完全在TFS中维护,并且仅在有人签入时才更新。因此,当您“获取最新”信息时,TFS会检查其数据库以查看发送给您的最新版本是什么。如果此数字等于当前版本,则认为您拥有最新版本;不管本地文件系统上实际有什么。这个想法是为了限制网络流量。不幸的是,该模型唯一起作用的方法是在所有具有TFS知识的应用程序中进行所有编辑。
NotMe 2010年

另外,我同意2005/08的版本中至少存在一个错误。我已经看到了您在多台计算机上描述的确切问题;这就是导致我虔诚地使用“获取特定版本”的原因。
NotMe 2010年

在某些情况下,编辑完全在一台计算机上在另一台计算机上的Visual Studio中进行,其唯一目的是获取最新版本,而不进行本地更改。但是它设法解决了这个问题。至少可以说,我对TFS源代码管理没有印象。希望2010年将减少这些问题。
Lasse V. Karlsen

3

可能是因为您以同一用户身份登录TFS,并且工作空间名称(默认情况下基于计算机名称)也相同,因此TFS认为您位于同一台计算机和同一工作空间上,因此您已经拥有最新版本的文件,所以它不会帮你。

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


2

我在Visual Studio 2012中遇到了同样的问题。无论我做什么,它都没有从TFS源代码控制获取代码。

在我的情况下,原因是将文件夹+子文件夹分别从源控件映射到本地HD中的同一棵树。

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


1

我在开发人员中看到的大多数问题都抱怨“获取最新消息”没有达到他们期望的效果,这是因为他们正在从解决方案资源管理器而不是从源代码管理资源管理器中执行“获取最新消息”。解决方案资源管理器仅获取解决方案中包含的文件,而忽略解决方案中文件所需的任何内容,因此也忽略了源代码管理的一部分,而源代码管理资源管理器将本地工作空间与服务器上的存储库进行比较,以确定哪些文件是必需的。


我从Team Explorer尝试过,结果仍然相同。以我为例,我删除了该文件夹,并希望再次获得最新副本,但没有运气。
Hammad Khan

1
我不同意这个答案。如果您有共享的不同的解决方案使用的项目,你必须做到这一点在Solution Explorer中,否则将只是做特定的TFS路径上的获取
Heliac

如果不应该使用解决方案资源管理器,为什么还要添加它呢?当我单击“显示所有文件”时,文件在那里,但未包含在我的项目中。很奇怪,因为我什至都不是添加它的人。
mokumaxCraig 2015年

1

如果我遇到这个问题,因为它没有最新的版本和版本不匹配,我首先将其“获取特定版本”设置为变更集并放入1。这将从本地工作区中删除所有文件(对于该项目,文件夹,文件等),并且还将进行TFS更新,以便它知道您现在没有要下载的版本。然后,您可以执行“获取最新”操作,然后中提琴就可以实际获得最新的


1

当您从具有相同帐户的两台不同计算机上使用TFS时,可能会发生这种情况,如果这样,您应该进行比较以查看更改的文件并签出它们,然后获取最新的版本,然后撤消未决的更改以删除签出


1

这对我 有用:
1.退出Visual Studio
2.打开命令窗口并导航到文件夹:“%localappdata%\ Local \ Microsoft \ Team Foundation \”
3.导航到每个版本的子文件夹并删除该子文件夹“缓存”及其内容
4.重新启动Visual Studio并连接到TFS。
5.测试获取最新版本。


0

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

我过去曾遇到过一个名为“ External @ Project1”的项目文件夹

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

经过一番尝试和错误后,将文件夹重命名为_Project1。瞧,我们在文件夹(_Project1)上找到了文件。


是否使用TFS,切勿在项目文件夹名称中使用特殊字符!
Heliac

@不特殊。而且%等等也不是。等等。只是Microsoft的懒惰导致这种字符与“正常”字符的区别对待。
凯文·怀特富特

0

工具: TFS电动工具

资料来源: http : //dennymichael.net/2013/03/19/tfs-scorch/

命令: tfpt焦化/递归/删除C:\ LocationOfWorkspaceOrFolder

这将弹出一个对话框,要求您删除或下载文件列表。相应地选择或取消选择文件,然后按确定。网格中的外观(复选框,文件名,文件操作,文件路径)

原因: TFS将仅与工作空间中的项目进行比较。如果在工作空间之外进行了更改,TFS将不会意识到这些更改。

希望有人觉得这很有用。我在删除了多个位置不同的文件夹后找到了这篇文章。不记得我删除了哪些文件夹,但排除了我本应使用的常规“强制获取/替换”选项。


0

就我而言,获取特定版本,即使同时选中两个复选框并撤消所有未完成的更改也不起作用。

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

修复路径并获得最新效果。


0

右键单击: 高级>获取特定版本。选择“最新版本”,现在,重要的是,选中两项检查: 在此处输入图片说明

检查包括:
覆盖未检查的可写文件

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


请描述需要检查的项目,而不是发布屏幕截图。
查克·亚当斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.