TFS中的版本控制模型增强功能

[原文发表地址] Version Control Model Enhancements in TFS 11

[原文发表时间] 2011-08-02 10:58 AM

      现在对于TFS开发者来说,最困难的问题莫过于“工作空间”了。工作空间是指将TFS服务器上的代码映射到你的硬盘上,并定义了你在对本地文件所做的操作是如何与服务器上的文件相关联的各种规则。自2005年来,我们就收到开发者们的反馈信息要求对这个空间做一些改进,基于此TFS 11做了一些重大的跨越。

我们还听到的一些普遍的问题如下:

  • 因为工作空间是一个全新的概念,我不得不在我着手前逼迫自己去理解。另外这种开发过程不直观,我不得不多花点时间才能上手。
  • 为什么我的磁盘上都是些只读文件,为什么我还得把文件签出(check out)呢?如果我用了除VS(或其它显示集成了TFS的)以外的工具,那就很痛苦了。版本控制是不会允许我那样做的。我只能编辑我的文件,然后等我准备好时再签入(check in)。
  • TFS在离线时(offline)工作的不理想。有时我得等好久,它才辨识得出我已经离线(offline)了。我只好修改只读文件的属性,然后再做一个TFS上线 (online)操作,把它们同步回来。一旦我离线(offline)了,我就什么都不能做了。
  • 嘿,为什么我明明不是最新版,想要获取最新版本的时候,它总是提示我已经是最新的了呢?

      在介绍我们此次的改进之前,先做一下背景介绍。当我们在设计TFS 2005之初,我们设计的目标之一就是要建立一个用来开发Visual Studio的系统。VS是一个大容量的代码库。我上次查看的时候,每一个分支都有大约5百万的文件,我觉得现在肯定还要比那时候多。平均每个开发者需要其中的10万到20万文件来完成各自的工作。另外,开发人员分散在全球各地,有时候网络连接会比较差(我们在NC开始的时候,有效带宽也不过300KbpsJ)。为了有效地管理这个问题,我们选择把大部分信息(包括本地工作空间的信息)储存在服务器上。这就意味着,像Get或者Merge这种操作只能在有完整上下文的服务器上运行,而只需向客户端发送一些他们需要的信息就行了。这个组合的相当好,让我们可以支撑起一直很大的团队和代码库。

      当然,也不是每个人都会需要这个的。另外,使用这种“服务器工作空间”要求你接受特定的工作方式。比如,你不能随意删除你硬盘驱动上的文件,再寄希望于服务器知道下次你调用get时你还需要这个文件。你得告诉你的服务器删除了这个文件。服务器假设它知道客户端的状态,并要求你通知它的变化。它处理的已经相当好了,但是还有些人习惯在本地做修改却期望TFS能够知道这些就真的让人费解了。

      为了解决这些,在TFS 11中,我们添加了一种全新的工作空间,叫做“本地工作空间”。如果你想,你还是可以使用服务器工作空间(实际上,考虑到代码库大小的问题,我们还是支持我们大部分开发者的),但是本地工作空间会被设为默认空间。在本地工作空间中,TFS会假定你的客户端是“主导”,TFS需要知道你所做的所有变更,然后做出正确的反应。用配置管理的话说,这叫 修改-合并-提交 风格版本控制,或者你可以想成“版本控制风格”。

      在本地工作空间中,文件不是只读的,你可以按你的意愿来编辑。当编辑他们的时候,他们会自动检测为“签出(checked out)”,你要是创建新的文件,TFS会检测它们,然后允许将这些文件添加到你的项目中。如果要在本地删除它们,TFS就会提醒,让你选择是要在TFS中删除还是从服务器上还原该文件,等等等等。这就意味着你无需再使用有版本控制集成的工具来确保它作出正确反应了(因为文件系统是主导),所以你可以使用NotePad或者其他工具,TFS同样会按照你需要的方式进行工作。本地文件是主导,而TFS只需按照它试着作出正确的反应。

      另外,作为其中的一部分,我们还极大地改进了离线(offline)场景。首先,介于本地文件系统已经是主导了,你无需用TFS去签出(check out)什么了。第二,我们新增了一项功能,支持保留你所获取的文件复本,支持一些离线(offline)操作,就像diff这样的比较功能。你能看到所做的更改还有撤销。如果你想重新来过也可以改回你的更改。第三,我们还新增了本地概念,待提交(Pending)更改,这样你就能在线下继续tf状态了(还能在VS中显示状态),还可以查看所有编辑过的文件(即使你没有告诉TFS你在编辑它们)。然后如果你想显示的告诉TFS做tf删除,tf添加或者tf重命名,这些操作也可以离线(offline)完成了。当你再次上线时,所有的东西都会自动同步,就好像你从来没离线(offline)过一样。

      我确定这次,一些人会问:“那你们有没有把DVCS(分布式版本控制)加入到其中呢。”答案是没有,还没有这么做。你在离线(offline)的时候还是不能签入(check in)。你也不能做历史或者分支合并操作。还是有些特定的操作是需要你线上完成的。你不会被长时间挂起,相反它会提供人性化地错误提示信息告诉你你需要上线才行。毋庸置疑DVCS肯定是我们以后要做的,这只是向这个方向迈进的第一步,我们还会继续努力的。

**更新**啊!我忘记提一些重要的事情了。首先我们在努力确保,在Windows上,我们的Eclipse客户端,VS客户端,命令行等都使用同一个本地工作空间数据,这样无论你使用的是哪个客户端,都能很好地进行共享。第二,关于排除清单(exclusion lists)我想到一个问题,在这里想提一下。我们支持排除清单(exclusion lists),不过我不确定我们现有的是不是最简化/最好的那个。我们还会再深入的看看的。如果你仔细地看视频,你会发现在管理检测变更对话底部有一个链接。最后,你要是上手了,我很想知道你对我们处理这些检测变更的方法的一些反馈信息。我们也在纠结我们是要保守点,还是自动化点。

看一下这个视频,亲自感觉一下实例中的这个本地工作空间。特别感谢Matt Mitrik帮我一起做这个视频。

[View:https://www.youtube.com/watch?v=g8Hf067fKUU&feature=player_embedded]

Brian