TFS的获取最新版本为什么不可靠?
你会认为这个功能已经经过了充分的测试。
我所需要做的是获取指定版本,然后检查覆盖可写文件和覆盖所有文件两个选项。
是我的本地设置出了问题还是你也要这样做?
TFS的获取最新版本为什么不可靠?
你会认为这个功能已经经过了充分的测试。
我所需要做的是获取指定版本,然后检查覆盖可写文件和覆盖所有文件两个选项。
是我的本地设置出了问题还是你也要这样做?
TFS重新定义了“获取最新版本”的含义。在TFS术语中,“获取最新版本”意味着获取文件的最新版本,但忽略服务器认为已经存在于您的工作区中的文件。对我和地球上几乎所有其他人来说,这是错误的。
唯一实现您想要的方法是获取特定版本,然后勾选“覆盖…”框的两个选项。
TFS和其他一些源代码控制提供商(例如Perforce)也是这样做的,因为系统知道您成功获得的上一个版本是什么,所以“获取最新版本”变成了“获取自x以来的更改”。如果您遵守其规则并在编辑之前实际检查事物,就不会混淆问题,“获取最新版本”确实可以按照其说法执行。
正如您所看到的,您可以强制它重新评估所有内容,这将产生更大的带宽使用量,但行为更接近SourceSafe的行为。
很难对一种没有给出它不起作用示例的语句做出回应,但重要的是要理解在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文档和博客还提供了详细信息:
强制获取最新副本的一种方法是手动删除隐藏的$TF文件夹。要这样做,请转到命令提示符并导航到您的项目被检出的根文件夹,并发出此命令。
rd/s $tf // remove $TF folder and everything inside it
dir /ah // display hidden files and folders
默认情况下,“获取最新版本”仅会下载与上次运行“获取最新版本”时在服务器上更改的文件。TFS会跟踪您下载的文件,以便不会重复下载这些文件的相同版本。如果您在Visual Studio之外修改文件,这可能会导致一些一致性问题,就像您所遇到的问题一样。
我在使用Visual Studio 2012时也遇到了同样的问题。无论我做了什么,它都无法从TFS源代码控制获取代码。
在我的情况下,原因是将文件夹+子文件夹分别映射到本地硬盘上相同的树中。
解决方法是使用“管理工作区”窗口删除子文件夹的映射。