我选择从 TFS 连接的解决方案中获取最新版本,然后按下取消,此操作是否具有事务性,我的意思是取消获取最新版本命令会取消整个操作或获取一些代码并取消剩余文件?
我的机器:
TFS 2010
VS 2010 SP1
我选择从 TFS 连接的解决方案中获取最新版本,然后按下取消,此操作是否具有事务性,我的意思是取消获取最新版本命令会取消整个操作或获取一些代码并取消剩余文件?
我的机器:
TFS 2010
VS 2010 SP1
TL;DR:是的,您的工作文件夹中的某些文件位于请求的变更集中,而某些文件位于其先前的变更集中,这是可能的。您可能希望获取特定的先前版本,以便“回滚”到该版本。
要查看发生了什么,我们可以将其分解为执行 get 时正在执行的实际步骤:
首先,客户端要求服务器获取特定版本。服务器将计算需要传输哪些文件才能将您从当前的变更集带到您请求的变更集。它将这些作为一系列“获取操作”返回给客户端。
此时,客户端应该生成多个线程来为 get 操作提供服务。这些线程中的大多数将是下载数据并将其放置在磁盘上的线程。将有一个额外的线程专门用于向服务器发送“本地版本更新”。
下载线程将 get 操作从服务器返回的列表中取出,并将其下载到磁盘到一个临时位置。下载完成后,他们会将其移动到其永久位置,并通知发送本地版本更新的线程该文件已完全下载。
本地版本更新线程将批处理来自下载程序线程的本地版本更新,直到达到某个固定数量,因为本地版本更新消息非常小并且一次发送一个会导致不必要的网络开销。一旦本地版本更新线程积累了足够的更新,它们就会被发送到服务器。这是服务器知道客户端具有他们请求的文件版本的点。
下载线程将继续为 get 操作提供服务,直到没有更多要处理的内容,并且本地版本更新线程将继续,直到所有下载线程完成下载并且所有本地版本更新都已发送到服务器。一旦这些发生,get 就完成了。
如果客户端支持取消,其逻辑应该如下:如果用户请求取消(例如,通过在基于 UI 的客户端中按下“取消”按钮),则应通知所有下载工作线程取消。如果他们正在下载文件,他们应该立即停止(只是丢弃他们正在读取的 HTTP 响应。)但是,一旦他们将文件从临时位置移动到永久位置,他们必须通知本地版本在他们退出之前更新线程。本地版本更新线程必须等待所有下载线程完成,然后在退出之前刷新所有未完成的本地版本更新。
因此,如果您在获取过程中取消,您可能在磁盘上有一些您尝试下载的文件,但客户端和服务器应该对每个文件的版本具有一致的视图。
如果您要杀死客户端,使其无法完全停止工作线程(例如,通过简单地关闭计算机电源),那么您可能会进入项目已提交到磁盘的状态但客户端尚未将本地版本更新刷新到服务器。在这种情况下,您可能在磁盘上有一个版本,而服务器认为您有不同的版本。万一发生这种情况,您需要在获取此文件时使用“强制”选项来协调此问题。
它不是事务性的。有些文件可能已经下载。在这种情况下,您应该在取消请求后获得特定版本。
根据我的经验,按“取消”会在磁盘上的版本与 TFS 认为磁盘上的版本之间产生差异。因此,如果您再次尝试更新,则不会下载任何内容,因为服务器认为您已经拥有最新版本。