为什么为什么 TFS 不能始终如一地获得最新作品?
您会认为该功能已经过彻底测试。
我要做的是,获取特定版本,然后检查覆盖可写文件+覆盖所有文件。
是我的本地设置搞砸了还是你也这样做了?
有时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
并获取文件即可解决此问题。
TFS, like some other source control providers, such as Perforce, do this, as the system knows what the last version you successfully got was, so get latest turns into "get changes since x". If you play by its rules and actually check things out before editing them, you don't confuse matters, and "get latest" really does as it says.
As you've seen, you can force it to reassess everything, which has a much greater bandwidth usage, but behaves closer to how SourceSafe used to.
如果没有说明它如何不工作的示例,很难对声明做出回应,但了解 TFVC(在“服务器工作空间”模式下,这是 TFS 2012 之前的机制)不检查本地文件系统的状态至关重要。TFVC Server Workspaces 是一种“签出-编辑-签入”类型的系统,这是设计使然,这是为了大幅减少确定工作空间状态所需的文件 I/O 量而做出的有意决定。相反,工作区信息保存在服务器上。
这允许 TFVC 服务器工作区非常有效地扩展到非常大的代码库。如果您在一个数 GB 的代码库中(如 Visual Studio 或 Windows 源代码树),那么您的客户端不需要扫描您的本地文件系统,查找可能已更改的文件,因为您与 TFS 的合同是您当您要编辑文件时,将显式检出文件。
您不应将文件标记为只写并在未先明确检出的情况下对其进行更改。如果你沿着这条路线走,那么服务器不知道你已经对你的文件进行了更改,并且执行“获取最新”操作不会更新你的本地工作区,因为你没有告诉服务器你已经做了变化。
如果您确实颠覆了这种机制,那么您可以使用该tfpt reconcile
命令来检查您的本地工作区以了解您在本地所做的更改。
如果您发现自己使用“获取特定版本”并选择“强制”和“覆盖”选项,那么您很可能习惯于绕过 TFS 实施的所有强制措施以防止您伤害自己,您可能应该考虑使用 TFVC 本地工作区。
TFVC 本地工作区提供“编辑-合并-提交”类型的版本控制系统,这意味着您无需在编辑文件之前明确检出文件,而且它们不是磁盘上的只读文件。相反,您只需要编辑文件,您的客户端就会扫描文件系统,注意到更改,并将其显示为待处理的更改。
TFVC 本地工作区推荐用于不需要细粒度权限控制的小型项目,因为它们提供了更好的工作流程。您无需在线,也无需在编辑文件之前明确签出文件。
TFVC 本地工作区是 TFS 2012 中的默认设置,如果您没有启用它们,那么您应该询问您的服务器管理员。(具有非常大的代码库或严格审计要求的组织可能会禁用 TFVC 本地工作区。)
Eric Sink 的优秀书籍Version Control By Example概述了 checkout-edit-checkin 和 edit-merge-commit 系统之间的区别以及何时比另一个更合适。
Professional Team Foundation Server 2013书还提供了有关 TFVC Server Workspaces 和 TFVC Local Workspaces 之间差异的出色信息。MSDN 文档和博客也提供了详细信息:
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 会认为你没有任何本地副本,即使你有它在文件中,它会再次同步所有内容。
注意:使用此方法需要您自担风险。请不要在关键工作上使用它。
"Get latest version" by default will only download the files that have changed on the server since the last time you ran "Get latest version". TFS keeps track of the files you download so it doesn't spend time downloading the same version of the files again. If you are modifying the files outside of Visual Studio, this can cause the consistency problems it sounds like you are seeing.
不幸的是,TFS 2008 中必须存在一个或多个错误,因为这个问题经常出现在开发人员机器上,并在我工作的地方构建服务器。
我可以做获取最新,我可以在项目的历史列表中看到在我最后一次获取最新之后有提交,我没有以任何方式触及磁盘上的文件,但是在“获取最新”功能之后完成后,当我检查 TFS 选项卡时,一些文件仍然说它们不是最新版本。
显然 TFS 能够确定我在本地有旧文件,因为列表是这样说的。然而,获取最新无法做到这一点,获取最新版本。如果我按照您的方式操作,请使用获取特定版本,并选中对话框底部的两个复选框,然后检索文件。
我们将构建服务器更改为始终使用获取特定版本类型的函数,因此这部分现在可以工作,但是由于我们的构建服务器(TeamCity)还依赖于检查文件是否有更改以启动构建,有时它会陷入“没有改变,这里什么都看不到,继续前进”模式并且在我们强制运行构建配置之前什么都不做。
请注意,我在从未接触过的机器上遇到过这个问题,除了手动获取最新 + 构建,因此没有任何篡改文件。只是 TFS 感到困惑。
有一次出现这种情况,我验证磁盘上的文件确实是与之前检索到的版本相同的二进制文件,因此没有对文件进行手动篡改。
此外,我看不到 TFS 如何在不实际查看内容的情况下“知道”磁盘上的文件是否已更改。如果 TFS 的某一部分可以看到文件确实不是最新版本,那么 Get Latest 版本应该绝对可以得到最新版本。这是参考此处对其他答案的评论。
可能是因为你是同一个用户登录TFS,并且工作区名称(默认基于机器名)也一样,所以TFS认为你在同一台机器和同一个工作区,因此你已经有了最新版本的文件,所以它不会为您获取它们。
尝试重命名您的机器,并创建一个新工作区作为新机器。
我在使用 Visual Studio 2012 时遇到了同样的问题。无论我做什么,它都没有从 TFS 源代码控制中获取代码。
在我的情况下,原因是分别从源代码管理映射文件夹+子文件夹,但映射到本地 HD 中的同一棵树。
解决方案是使用“管理工作区”窗口删除子文件夹映射。
当我遇到这个问题时,它没有获得最新版本并且版本不匹配,我首先执行“获取特定版本”,将其设置为变更集并放入 1。这将删除本地工作区中的所有文件(对于该项目、文件夹、文件等),它还将更新 TFS,以便它知道您现在没有下载任何版本。然后你可以做一个“获取最新”和中提琴,你实际上将拥有最新的
当您从具有相同帐户的两台不同机器上使用 TFS 时可能会发生这种情况,如果是这样,您应该比较以查看更改的文件并签出它们,然后获取最新的然后撤消挂起的更改以删除签出
我看到的大多数开发人员抱怨“获取最新”没有按照他们的预期执行的问题都源于他们从解决方案资源管理器而不是源代码管理资源管理器执行获取最新的事实。解决方案资源管理器仅获取作为解决方案一部分的文件,并忽略解决方案中的文件可能需要的任何内容,因此是源代码管理的一部分,而源代码管理资源管理器将您的本地工作区与服务器上的存储库进行比较以确定哪些文件是需要的。
这对我有用:
1. 退出 Visual Studio
2. 打开命令窗口并导航到文件夹:“%localappdata%\Local\Microsoft\Team Foundation\”
3. 导航到每个版本的子文件夹并删除子文件夹“缓存”及其内容
4. 重新启动 Visual Studio 并连接到 TFS。
5. 测试获取最新版本。
每次发生这种情况(到目前为止)都是因为我在 .csproj 项目文件上有待处理的本地编辑。该文件似乎保留了项目中包含的所有文件的列表。其他人添加的任何新文件都“未下载”,因为它们不在我本地编辑的(现在是陈旧的)项目文件中。要获取所有文件,我首先必须先撤消对 .csproj 文件的未决更改,然后“获取所有”。我不必撤消我所做的其他更改,但我可能必须返回并再次包含我的新文件(然后下一个人在尝试“获取所有”时遇到同样的问题......)
在我看来,当多人同时添加新文件时,存在一些基本的笨拙。
(这是在 .Net Framework 项目中,可能像 Core 这样的其他框架表现不同)
在我的情况下,获取特定版本,即使选中两个复选框并撤消所有待处理的更改也不起作用。
检查了工作空间。编辑当前工作区。检查所有路径。解决方案路径不正确,指向已删除的文件夹。
修复了路径并获得最新的工作正常。
只想添加 TFS MSBuild 不支持文件夹上的特殊字符,即“@”
我过去曾经历过我们的一个项目文件夹名为 External@Project1
我们创建了一个 TFS 构建定义来运行自定义 msbuild 文件,然后工作区文件夹在工作区获取最新期间未在 External@Project1 文件夹中获取任何内容。似乎 tfs get 失败但没有显示任何错误。
经过一些试验和错误并将文件夹重命名为_Project1。瞧,我们在文件夹(_Project1)上找到了文件。
工具: TFS 电动工具
资料来源: http ://dennymichael.net/2013/03/19/tfs-scorch/
命令: tfpt scorch /recursive /deletes C:\LocationOfWorkspaceOrFolder
这将弹出一个对话框,要求您删除或下载文件列表。相应地选择或取消选择文件,然后按确定。网格中的外观(CheckBox、FileName、FileAction、FilePath)
原因: TFS 只会与工作区中的项目进行比较。如果在工作区之外进行了更改,TFS 将不会意识到它们。
希望有人觉得这很有用。我在删除不同位置的几个文件夹后发现了这篇文章。不记得我删除了哪些文件夹排除了我会使用的通常的强制获取/替换选项。