我的商店使用TFS并且除了缺少本地存储库提交/恢复之外通常都很满意.我自己开始在本地使用Mercurial来帮助管理较小的更改块,然后将它们发布到TFS.我看到Subversion有一个'bridge'组件,如果中央VCS是Subversion,它可以自动启用它.我没有为Team System找到一个.这鼓励了我,其他人已经将DVCS与CVCS系统集成在一起.
(1)有人知道吗?我有点怀疑它(快速搜索找不到任何东西).
(2)是否有人以这种方式使用Mercurial/TFS?如果是这样,你能分享你的经历吗?我特别希望了解在通过Mercurial进行重大活动后提交给TFS的问题可能出现的问题.
到目前为止,这似乎是一个完全双赢,只有我使用了几天 - 但我知道足够的,然后认为这就是那么容易.
ckr*_*mer 53
不确定这是否是你还不知道的,但我现在已经在本地使用mercurial了一段时间,到目前为止我认为其好处超过了管理两个源控制系统的额外开销.以下是我一直在做的事情:
我让我的TFS结账成为HG存储库,我认为这是我的"主人".我从TFS获得更新并将它们提交到此repo,因此它包含来自TFS的项目的最新状态.这里重要的是没有对TFS更新或Hg合并(这是第2部分)的更改
无论何时我需要做出改变,我都会克隆我的"主"回购并在那里做我的工作.我发现每个功能或故事的克隆实际上很容易管理,并且感觉很干净.完成一项功能后,我会将Hg合并回"master"仓库,该仓库已应用了所有TFS更新.这允许我使用Mercurials合并功能,这些功能到目前为止优于TFS,因此可以质疑TFS如何声称合并代码.合并完成后,我将其提交给Hg,然后将这些更改检入TFS.最好的部分是,当我签入TFS时,我不必合并任何东西.非常非常棒.
现在,这是我用这种方法找到的问题:
最大的问题是TFS在寻找变化方面很糟糕.有一个make可写插件,可以用来在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主题分支的技术而不是将存储库克隆到新目录来最好地处理大小问题.有几种选择.我认为最好的是使用书签扩展并创建主题"书签"而不是主题分支.您也可以使用命名分支,但它们具有永久性的轻微缺点,并且可能与您可能执行的任何克隆一起旅行(如果您想与同事共享您的漂亮的TFS-Hg混合).书签是您的仓库的本地标记,并且有效地指向提交并与头部一起旅行.它们被实现,以便它们可以在Hg期望修订的任何地方使用(因此合并,更新等).您可以使用这些来创建TFS书签作为主要"分支",它只从TFS获取更新,并从主题工作合并,每个主题工作都有自己的书签,并且您可以在提交回TFS后删除.如果您更愿意使用命名分支,那么您可以应用完全相同的技术,这很方便.
现在,多分支问题比较棘手,特别是因为TFS"分支"实际上是来自原始分支的每个文件的副本,这意味着每次从TFS引入分支时,您的repo将变得更大.处理此问题的一种可能方法是使用命名的Hg分支和书签的组合,以便为每个TFS分支创建一个分支,然后为这些分支的工作创建书签.这些场景中真正令人头疼的是通过所有这些实际处理TFS工作区.您可以删除工作区中的映射并获得相当远的距离,但是一旦您映射回工作目录,就必须小心TFS对文件的踩踏(这实际上是TF PowerTools派上用场的地方).尝试离开工作区时,你的切换分支会变得很难看.在你的工具带中有一些很好的工具是Hg 吹扫扩展和TF PowerTools"scorch"命令.两者都有效地删除了不受版本控制的文件(技术上"scorch"确保TFS和本地工作目录匹配,因此它也可以更新文件).
但对我来说,这个过程变得相当繁琐且容易出错.我最近转而使用git和git-tfs,因为它为我管理TFS工作区,并消除了与该方相关的许多负担.可悲的是,那里似乎没有"hg-tfs",或者我可能已经选择了那个.
如果你没有停留在mercurial上,那么我一直在使用一个名为git-tfs的甜蜜的git/tfs集成项目.它与git-svn非常相似,但是从TFS推送/拉取.请访问http://github.com/spraints/git-tfs查看
@Eric,你在lostechies的帖子最有帮助.使用VS2010,我必须在push脚本中的tftp online命令中添加options / diff和/ deletes,以便更改和删除要检入TFS的文件.最初,我是从推得到一个错误,当一个文件被删除(从木材加工),其汞更新是
"无法删除FileXyz:访问被拒绝".
我安装了MakeWritable.py扩展名,但只有在打开文件时才会删除.所以我添加了一个totrib的调用,从项目中的所有文件中删除READ-ONLY,然后恢复它(不包括.hg文件夹)我还添加了/ diff选项,以便MD5校验和检测到差异,而不是依赖于READ-ONLY属性.现在似乎工作正常.
=====FILE: push.ps1=====
$projName = "TicTacToeCMMI"
$tftp = "C:\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.exe"
$tf = "C:\Program Files\Microsoft Visual Studio 10.0\Common7\ide\tf.exe"
hg push
cd ..\$projName-tfs
"Syncing -tfs workspace with TFS server"
&$tftp scorch /noprompt /exclude:.hg',_Resharper*',*.user
"Making all files in -tfs writable"
attrib -R /S /D *
"Updating -tfs with latest push from Mercurial"
hg update -C -y
attrib +R /S /D *
attrib -R /S /D .hg\*
"Resyncing Mercurial changes with TFS Server"
&$tftp online /adds /deletes /diff /exclude:'.hgignore,.hg,bin,obj,*.ps1,_Resharper*,*.lnk,*.user,*.suo,*.vspscc'
"Checkin"
&$tf checkin
cd ..\$projName-working
cmd /c pause
====FILE: pull.ps1=====
$projName = "TicTacToeCMMI"
$tf = "C:\Program Files\Microsoft Visual Studio 10.0\Common7\ide\tf.exe"
$username = cmd /c set USERNAME
$username = $username.SubString($username.IndexOf("=")+1)
function pull {
cd ..\$projName-tfs
&$tf get
hg commit -A -m "from tfs" --user $username
cd ..\$projName-working
hg pull --rebase
}
pull
cmd /c pause
Run Code Online (Sandbox Code Playgroud)
我有一些PowerShell脚本的学习曲线,我以前没用过.对于像我这样的其他人来说脚本是用这样的快捷方式运行的:
TARGET: C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\dev\TicTacToeCMMI-working\push.ps1
START IN: C:\dev\TicTacToeCMMI-working
Run Code Online (Sandbox Code Playgroud)
我在我的任务栏上放了推拉快捷键,所以只需单击即可向/从TFS推送/拉出