不知道这是否是您尚不知道的东西,但是我已经在本地使用了一段时间,到目前为止,我认为其好处超过了管理两个源代码控制系统所增加的开销。这是我一直在做的事情:
我将TFS结帐设置为HG存储库,我认为这是“主”文件。我从TFS获得更新并将它们提交到此存储库,因此它包含TFS项目的最新状态。这里重要的是,对此所做的任何更改都不会独立于TFS更新或Hg合并(这是第2部分)
每当我需要进行更改时,我都会克隆我的“主”存储库并在那里做我的工作。我发现每个功能或故事的克隆实际上很容易管理,而且感觉很干净。完成功能后,我将Hg合并回“主”存储库,该库已应用了所有TFS更新。这使我可以使用Mercurials合并功能,该功能远远优于TFS,以至于使人怀疑TFS如何声称可以完全合并代码。合并完成后,我将其提交到Hg中,然后将这些更改检查到TFS中。最好的部分是,当我对TFS进行签入时,我不必合并任何内容。非常非常棒。
现在,这是我使用这种方法发现的问题:
最大的事实是,TFS很难找到更改。有一个使可写的插件,当Mercurial更新/合并修改后的文件时,可使用该插件使它们变为可写的。我为此找到了两个选择。您可以强制TFS脱机,这时它将假定需要签入任何可写内容,或者可以使用源代码管理工具中的比较工具并选择更改的文件并逐个签出。两者都是糟糕的IMO
即使从hg存储库中排除了TFS源代码控制文件,源代码控制绑定仍在项目级别上(应该这样做)。在将文件添加到解决方案之前,这并不十分明显,此时它将尝试将其添加到源代码管理中。您可以“撤消待更改”并摆脱源代码控件的添加,但这确实很烦人。
好消息是,我使用这种方法进行了相当大的合并,如果我被迫使用TFS工具来进行合并,我认为这会使我转向某种形式的硬性药物。
我还没有将其应用于更新TFS中的分支,但是我猜想它会比为TFS进行合并提供的选项好得多。值得一提的是,由于您可以一次检入工作功能块,因此使用TFS合并将不会有太大问题,因为一个功能所需的所有更改都将集中在一个地方。
我没有试图解决的一件事是在整个团队中共享这一点。部分原因是,它实际上不一定是整个团队的事情。我是远程工作的,因此拥有本地存储库很重要,并且可以节省大量时间。我的开发团队的其他成员可能会或可能不会从这种方法中获得相同的好处,但是我发现很酷,我可以在不影响他们工作方式的情况下做到这一点。
更新资料
我一直想用评论和我在大型TFS存储库上的一些经验为基础的附加信息来更新此响应。
首先,正如@ Eric Hexter在评论中指出的那样,您可以利用rebase扩展将您的工作存储库中的提交更好地集成到您的主要TFS存储库中。但是,根据您希望提交在TFS中显示的方式,您可能希望使用折叠扩展将更改压缩到单个提交中(这可以使TFS中的回滚更加容易)。TFS PowerTools中还有一个“在线”命令,可以使TFS知道发生了什么变化的工作变得更加容易(再次感谢Eric在他的博客文章中提到)。
现在,当我最初写这篇文章时,我正在开发一个只有开发人员正在使用的TFS分支的项目,并且这个项目很小,因此克隆存储库没什么大不了的。后来我发现自己正在从事一个项目,该项目的存储库在签出后大约为1.5GB,在构建后更大,并且经常在TFS中切换分支。显然,这种方法不太适合这种环境(特别是因为有时无法在任意目录中构建解决方案。
通过使用类似于gits topic分支的技术而不是将存储库克隆到新目录,可以最好地解决大小问题。有两种选择。我认为最好的方法是使用书签扩展名并创建主题“书签”,而不是主题分支。您也可以使用命名分支,但是它们有一个永久性的缺点,即可以随身携带任何克隆(如果您想与同事共享漂亮的TFS-Hg杂种)。书签在您的存储库中是本地的,可以有效地指向提交并随脑袋旅行。实施它们是为了使它们可以在Hg希望进行修订的任何地方使用(例如合并,更新等)。您可以使用它们来创建TFS书签作为您的主要“分支”,该分支仅从TFS获取更新,并从主题工作中合并,每个主题工作都有自己的书签,一旦提交回TFS,就可以删除。如果您想使用命名分支,则可以应用完全相同的技术,这很方便。
现在,多分支问题变得更加棘手,尤其是因为TFS“分支”实际上是原始分支中每个文件的副本,这意味着每次从TFS中引入分支时,您的仓库都会变得更大。解决此问题的一种可能方法是使用命名的Hg分支和书签的组合,以便为每个TFS分支都有一个分支,然后为这些分支之外的工作创建书签。在这些情况下,真正令人头疼的实际上是通过所有这些来处理TFS工作区。您可以删除工作空间中的映射,并且可以走得很远,但是一旦映射回工作目录,就必须小心TFS踩踏文件(实际上这是TF PowerTools派上用场)。在切换分支时,尝试使工作空间保持连接状态非常麻烦。Hg是两个很不错的工具清除扩展名和TF PowerTools的“ scorch”命令。两者都有效地删除了不在版本控制中的文件(从技术上来说,“烧焦”可确保TFS与本地工作目录匹配,以便它也可以更新文件)。
但是,对我而言,此过程变得非常繁重且容易出错。我最近改用git和git-tfs,因为它可以为我管理TFS工作区,并消除了与此有关的许多负担。可悲的是,似乎在任何地方都没有“ hg-tfs”,否则我可能会选择它。