Lab version:15.4

Last updated:11/15/2017

概述

在本实验中,您将了解使用Visual Studio 2017中的Git源代码管理工具管理Team Foundation Server 2018中的Git存储库. Git是一个分布式版本管理系统,其中存储库既可以在本地(例如在开发人员的计算机上)存在,也可以存储在Team Foundation Server上。TFS Git支持GFS虚拟文件系统 (GVFS) ,GFS几乎可以使您无限扩展Git存储库。微软的Windows团队使用它来管理超过300万个,共300GB的文件。

登陆培训环境

  1. 打开实验室环境

  2. 点击右上角的登陆链接。

  3. 使用微信登陆,扫描二维码。

  4. 选择环境列表

   

  1. 选择TFS Labs

  2. 找到已购环境,点击进入

   

  1. 点击 远程连接 中的图标,连接到远程实验环境。

   

> **Note:** 实验环境默认登陆用户为系统账户**azureuser**, 实验中需要使用环境预制账户如:**Sachin Raj (Sachin)**。
  1. 如果实验中需要切换用户,可以点击远程连接页面下拉菜单中的用户切换,输入用户名以及密码,点击连接,就可以实现切换实验环境远程登陆账号。

   

 

  1. 如果实验中需要复制粘贴文档中的相关内容到虚机中可以使用labs自带的复制粘贴版进行操作

 

关于Fabrikam Fiber的项目背景

这套动手实验室使用一家虚拟的公司Fabrikam Fiber作为实验背景。Fabrikam Fiber向美国提供有线电视和相关服务。他们正在迅速增长,并且已经将产品部署到Windows Azure,产品包括允许用户在网站上自助购票的应用;还有为其客户经理管理客户订单的ASP.NET MVC应用程序。

在这套动手实验室中,您将参与许多Fabrikam Fiber团队的开发和测试场景。在实验中这个由8-10人组成的团队使用Team Foundation Server来管理他们的源代码,运行他们的生成,测试他们的产品,并管理软件研发计划和跟踪软件项目的开发过程。

练习1:开始使用Git

在本练习中,您将学习如何创建,克隆和推送Git存储库,并将修改提交到Team Foundation Server。

任务1:创建一个Git仓库

  1. 使用切换用户功能,切换登陆用户为 Sachin Raj (Sachin). 所有密码都是 P2ssw0rd

  2. 从任务栏启动Visual Studio 2017并打开Team Explorer。您现在应该连接到FabrikamFiber团队项目。如果您没有自动连接到FabrikamFiber项目,请单击管理连接,然后双击FabrikamFiber项目来执行此操作。

  3. Fabrikam Fiber在Team Foundation Server中使用Git作为其源代码管理的原因有几个:一是因为开发人员使用Xcode等工具进行开发,Xcode本身支持Git。另一个原因是开发人员需要在脱机状态下工作,并且希望在脱机状态下在本地管理代码版本,并在进入办公室时将此代码推送到Team Foundation Server中。微软现在为团队提供了Git源代码管理支持。Visual Studio 2017还为开发人员提供了管理Git存储库的工具 - 无论存储库是由Team Foundation Server,本地存储库还是其他Git工具创建的。

  4. Home下拉菜单中选择Projects and My Teams | New Team Project

  5. 将新项目命名为“FabrikamCommunity”,然后单击Next

  6. 选择Scrum流程模板,然后单击Next继续。

  7. 选择Git作为版本管理,然后单击 Finish

  8. 在创建新的Git团队项目之后,单击Close返回到Visual Studio。

任务2:克隆Git存储库

  1. Team Explorer中,单击Clone this repository

  2. 使用默认路径和存储库位置,然后单击Clone。输入同户名密码(Sachin/P2ssw0rd)。

  3. 单击Manage Connections按钮,然后双击FabrikamCommunity以连接到新建的团队项目。

任务3:提交代码并链接到工作项目

  1. Team Explorer中,单击Home按钮,然后单击Settings

  2. 点击Git下的Global Settings

  3. 输入Sachin Raj的电子邮件地址(sachin@vsalm.local),然后点击Update

  4. 单击Team Explorer中的Home按钮。

  5. 在浏览器中连接到TFS网站,并选择FabrikamCommunity团队项目,从主菜单选择Team | New Work Item | Product Backlog Item打开New Product Backlog Item表单。

  6. 输入“Create new web site”标题,然后点击Save按钮。工作项目保存后,请记下ID。

  7. 回到Visual Studio。在Team Explorer中,单击Solutions下方的New…

  8. New Project窗口中,选择Visual C# | Web | ASP.NET Web Application序模板并单击OK

  9. 选择MVC模板,然后单击OK

  10. 项目创建后,在Team Explorer中单击Changes查看文件提交的列表。

  11. 滚动到included changes列表的最后,.gitattributes和.gitignore文件被自动添加到项目中。.gitattributes文件包含Git设置,以控制GIT中的操作。而.gitignore文件指定忽略修改的文件。

  12. 如果您想排除特定文件(或基于扩展名的文件类型),可以在此处右键单击它并选择其中一个选项。这会为你更新.gitignore。现在不要做这个操作。

  13. 输入提交注释,注释以类似于“initial MVC site for work item #247”。输入”#”后紧跟工作项ID,将在提交到TFS服务器时自动将此次提交链接到ID对应的工作项。这里使用您保存的产品待办事项ID替换这里的247。

  14. 通过单击Commit All来提交更改。

  15. 让我们对网站进行一些小改动。在Solution Explorer中,从Views\Shared文件夹中打开_Layout.cshtml

  16. 将页面标题“My ASP.NET Application”的末尾修改为“Community”(大约在第6行)。

  17. Team Explorer中,输入提交注释,然后单击Commit All。弹出提示时选择Save保存对文件的更改。

任务4:向服务器同步提交

  1. 通过单击Sync导航到提交视图。

  2. Team Explorer中的Synchronization视图显示传入和传出的提交。但是,由于此项目尚未发布到源代码管理,因此您只需单击push即可。

  3. 最后,让我们快速在TFS网站中浏览一下这些提交。在Team Explorer中,单击Web Portal

  4. 从Web门户的Code下拉列表中选择Commits

  5. 点击第一个(底部)提交。

  6. 请注意,一个工作项目已根据注释中的ID标记链接到这个提交。点击展开它,然后选择“Create new web site”工作项以在新选项卡中查看它。

  7. 查看后关闭工作项目选项卡。

  8. 点击Sachin的名字,然后点击 Pushed on链接。

  9. 您可以通过单击其中一个链接来浏览或下载此特定提交的版本。

任务5:标记发布

  1. 虽然看起来不多,但产品团队已经决定该版本的网站正是v1.0所需要的。为了标记它,请导航到Tags选项卡,然后单击Create Tag

  2. name中输入“v1.0”Description中输入“First release!”,点击Create

  3. 您现在已经在此版本上标记了该项目。您可以出于各种原因对提交进行标记,并且TFS可以灵活地编辑和删除它们,也可以管理标记的权限。

练习2:Git分叉,分支和合并

在本练习中,您将学习有关Visual Studio中的Git分叉,分支和合并等功能。通常,分叉和分支常常用于切换开发环境,实现隔离并行开发的风险。例如,核心项目团队可能会使用Git分支来允许团队外的人员为项目提供修改,而不允许他们直接提交修改。由于Git fork是项目的服务器端副本,所以体验是相同的,只不过它为所有者提供了一层可管理性。Git分支是一个类似的概念,允许成员在一个项目中工作而不允许直接在主分支提交修改。建议您在大多数情况下只使用分支(而不是分叉)。创建一个Git分支是一个轻量,快速的操作,因为您只是创建对现有提交的新引用。这与Git分叉或TFVC分支非常不同,因为Git分叉或TFVC的分支需要在服务器端复制整个存储库。我们还将快速了解对Git合并的支持。

任务1:分叉存储库

  1. 从导航栏中,单击Fork。该分叉将用于团队外的人员为项目提供更改。例如,如果有人想提交对Bug的修改,他们会将其推送到此分叉上的分支并请求拉取。团队中的成员(这里是Sachin)会评审拉取请求,在满足合并要求后通过合并将变更合并到主项目中

  2. Repository name设置为“FabrikamCommunity.External.fork”并单击Fork。请注意,您可以指定包含所有分支,但通常只分叉default branch

  3. 在Visual Studio中单击Clone。将分叉的存储库克隆到本地。

  4. 单击Allow以允许Visual Studio读取克隆文件。

  5. 点击 Clone克隆存储库。

  6. 克隆完成后,在Solution Explorer中找到WebApplication1.sln,然后双击将其打开。请注意,尽管它与之前Git存储库几乎完全相同,但它是与之前存储库关联的完全不同的存储库。

任务2:分支代码

  1. Team Explorer中,单击 Branches.

  2. 假设我们想创建一个新的分支来在网站上进行一些开发工作。右键单击master分支节点并选择New Local Branch From

  3. 将名称设置为“users/sachin/about”,然后单击Create Branch。请注意,该名称使用的分支命名将此分支创建在“users/sachin”下。

  4. 双击about签出分支。

  5. Solution Explorer中, 从Controllers文件夹中打开HomeController.cs文件。

  6. 按照如以下屏幕截图所示修改About方法。

  7. 右键单击编辑器空白处并选择Source Control | Commit

  8. Team Explorer中,输入提交注释”Sachin version“,然后单击Commit All。出现提示时选择保存更改。

  9. 此时,这些更改已提交到本地存储库。导航到Branches视图。

  10. 双击Master分支,此时HomeController.cs文件的原始版本显示在代码编辑器窗口中。

  11. 如果您想继续在本地工作,则不必将分支推送到服务器。正如您在前面的练习中看到的那样,您可以继续在本地工作并向新分支提交其他修改。在Team Explorer中,右键单击about分支并选择View History

  12. 现在您可以将其合并回主分支并删除此分支,或将其推送到服务器端的存储库,以便其他团队成员可以拉取你的提交。现在通过右键单击about分支并选择Push Branch选项来发布分支。

  13. 切换用户Clemri Steyn (Clemri)进行连接。所有的用户密码都是P2ssw0rd

  14. 从任务栏启动Internet Explorer, 打开http://vsalm:8080/tfs

  15. 从项目集合下拉列表中选择FabrikamFiberCollection

  16. 将鼠标悬停在FabrikamCommunity团队项目上并选择Code

  17. FabrikamCommunity存储库下拉菜单中选择FabrikamCommunity.External.fork

  18. 单击Clone按钮并按照之前的工作流程在Visual Studio中克隆该项目。

  19. Solution Explorer中,双击WebApplication1.sln解决方案将其打开。

  20. 修改Sachin修改的相同HomeController.cs文件,但是这次将文本改为不同的内容。通常Clemri会像Sachin一样在分支中进行此项更改,但为了实验目的,这里将直接在master分支提交修改。

  21. 和之前一样,在代码编辑器的空白处右键单击并选择Source Control | Commit

  22. Team Explorer中,提交注释输入”Clemri version“,然后单击Commit All。提示时选择保存更改。请注意,Clemri在master分支直接提交了修改。

  23. 从提交反馈中单击Sync

  24. 点击Sync以执行同步。

  25. 返回用户Sachin的操作界面。

任务3:合并存储库中的更改

  1. 从Sachin的角度来看,他迄今已经创建了一个基于master的本地分支,并在此分支提交了修改,然后发布了该分支。现在他想继续将about分支上的修改合并到master分支。

  2. Team Explorer中,双击签出master分支。

  3. 展开Merge选项。

  4. 选择about分支作为源并单击Merge

  5. 请注意,master分支当前处于签出状态,并且HomeController.cs显示为about版本。合并是在本地通过更新master分支指向,将其指向为about分支的最新提交。

  6. 右键单击 Team Explorermaster分支,然后选择View History…选项。

  7. 历史视图现在展示了当前代码是如何通过相关的各个分支的提交组合而成的。

  8. 如果这个是真是的开发场景, 用户Sachin很可能仍然不知道用户Clemri的提交直接推送到了了master分支,现在他将尝试推送他的提交。通过导航下拉菜单导航到Team Explorer中的Sync视图。

  9. Click Sync to attempt a pull and a push with the server.点击Sync,将提交推送到服务器。

    Note::如果您看到一个弹出窗口,显示已打开的文件已在外部进行更改,单击Yes

  10. 这个时候Visual Studio会提示存在冲突,我们无法推送我们的提交。点击Resolve the conflicts

  11. Resolve Conflicts视图中,从Conflicts列表中选择文件HomeController.cs,然后单击Merge

  12. 在Visual Studio中Git的冲突解决编辑器与Team Foundation Version Control所使用的非常相似。这里假设我们要保留Sachin的更改是正确的,因此请选中右上窗格中显示的框。

  13. 点击 Accept Merge

  14. 单击 Commit Merge

  15. Changes视图中,虽然冲突已解决,但仍需要提交更改。提交时同样输入注释,然后单击Commit All下拉列表并选择Commit All and Sync

  16. 导航到Team Explorer中的Home视图,然后单击Web Portal

  17. 选择顶部的菜单选择Code | Commits

  18. 在这里我们可以看到迄今为止提交的完整列表,以及分支和提交的可视化追踪视图。

  19. 选择Branches选项卡查看TFS上Git存储库的所有分支。

任务4:Git存储库权限设置

  1. Repositories下拉列表中选择Manage Repositories, 这里可以按照TFS组或者用户对Git存储库、分支进行权限设置。

  2. TFS支持在同一个团队项目中创建多个Git存储库。

  3. 选择FabrikamCommunity.External.fork存储库。您可以对用户和安全组设置存储库级别的权限。

  4. 选择Master分支。设置当前所选分支权限,Git的权限粒度设置最小到分支级别。

任务5:管理分支策略

  1. 在TFS的Git中可以使用拉取请求将源分支的提交合并到目标分支,在拉取请求中可以要求评审人员对此次代码合并进行评审,团队成员可以通过拉取请求追踪整个版本的修改,并对修改进行社交化评论,评审本身也可以被追踪。在拉取请求中我们同样可以关联TFS工作项来表明当前需要合并代码实现的需求,修改的Bug等。并且TFS提供了强大的自动化质量检测机制帮助团队在拉取请求中预先验证生产代码版本。

  2. 虽然在没有启动分支策略的情况下也能使用拉取请求,但是使用分支策略能帮助我们加强对版本提交的整体控制。在上个练习的Manage Repositories页面选择Branch Policies选项卡。

  3. 可以通过启动分支策略防止团队成员直接向master分支签入代码,比如刚才我们使用Clemri账户做的操作。 勾选Protect this branch后,可以对被保护分支进行详细策略设置。

  4. 选中Require a minimum number of reviewers并将最少审阅者数量设置为“1”。另外勾选Allow users to approve their own changes(以便在后面实验顺利进行)。

    Note:也可以通过配置分支策略,在更新源分支时触发构建。当构建失败时,阻止完成拉取请求,使源分支代码不能合并到主分支。

  5. 还可以要求拉取请求必须关联工作项,对于修改进行的评论必须被处理,以及在完成拉取请求时指定合并策略。

  6. 您可以利用分支策略,自动触发TFS配置好的生成,还可以指定当Git存储库内的特定路径下的代码发生改动时,必须由特定的人进行代码评审,这样可以有效防止低质量提交对于主分支得影响。例如,如果拉取请求被更新后,指定得生成运行失败,则可以阻止拉取请求。

  7. 对于指定路径下代码的改动需要指定人员审核,可以如下设置。例如,假设Sachin现在需要评审所有对ASP.NET MVC应用中Controller所做的所有更改。点击Add automatic reviewers

  8. 添加Sachin作为Reviewer,并设置Paths以指定在路径“/WebApplication1/WebApplication1/Controllers/*“Controllers文件夹中的所有文件。点击Save

  9. 单击Save Changes保存主分支策略。

任务6:评审代码,使用拉取请求进行代码合并

  1. 切换回Clemri用户。

  2. 单击Sync以确保本地存储库master分支与服务器上的内容一致。如果您在编辑器中打开了HomeController.cs,则可能会提示重新加载。因为Sachin推送了更改。

  3. 现在假设项目组成员Clemri需要更新一些Controller的代码。首先根据master分支创建一个新分支。在Team Explorer导航到Branches。右键单击master分支并选择New Local Branch From

  4. 分支名称设置为“users/clemri/controllerupdate”。。使用默认选项Checkout branch。点击Create Branch

  5. 这样命名分支,可以对分支进行分组管理, 可以按需求将分支放在指定目录中。

  6. remotes/origin找到users/sachin/about分支。VS的Git客户端支持使用cherry-pick方式从其他分支上挑选提交以便将代码拉入当前分支。可以通过右键单击about分支做cherry-pick。但不要现在执行,按Esc关闭菜单。

  7. 在文件HomeController.cs中更新About方法。 将字符串替换为 “Clemri’s enhanced description page.”

  8. Team Explorer中,填写提交注释,然后单击Commit All。出现提示时单击保存更改。

  9. Team ExplorerBranches图中,右键单击当前分支并选择Push Branch

  10. 成功发布分支后,点击Create a pull request后会在浏览器上打开拉取请求。

  11. 确保选中FabrikamCommunity.External.fork分支,然后单击Create使用默认选项创建拉取请求。在点击创建前可以根据需要添加其他用户来参与评审,也可以关联其他工作项目。

  12. 创建拉取请求后,可以在拉取请求查看更改文件列表,以及每个文件与目标分支的差异;源分支与目标分支差异的提交信息,拉取请求更新信息,评审信息等。同时在拉取请求的概述页面还可以看到不满足的策略,以及哪些策略已经满足。

  13. 为了演示分支策略的实际应用,假设Clemri尝试自己完成pull请求。选择**Set auto-complete Complete**。

  14. 尽管有违反策略的提示,这里仍然可以单击Complete merge, 接下来我们看看会发生什么情况。

  15. 拉取请求反馈:该请求至少需要一位审阅者批准。

  16. 单击 Approve, 然后单击 Complete, 然后单击对话框中的 Complete Merge

  17. 请注意,已经满足了在分支策略中设置的至少1个人员评审的要求,但应为我们修改了Controller文件夹下的代码,因此指定的成员Sachin也必须评审。

  18. 在这里,Sachin需要通过某个通信渠道得到这个拉取请求的通知,比如:通过Skype,通过团队通知还是通过TFS拉取请求提醒。在练习中我们不再演示这些内容, 我们直接跳过Sachin评审代码的过程。

  19. 使用用户Sachin登陆。

  20. 在Web门户中,导航到Code | Pull Requests

  21. 点击Clemri创建的拉取请求。

  22. Sachin现在可以检查与拉取请求相关的所有文件和提交并做出决定。Sachin也可以与Clemri(也可能是其他评论者)进行对话,以便作出决定,或者甚至可以在获得批准之前进行其他的工作。

  23. 这里我们设置自动完成批准请求。有几个选项可供选择。点击 Set auto-complete

  24. 自动完成功能使您能够在通过所有策略之后自动完成拉取请求。例如,如果在完成PR之前需要成功构建,当其他策略已经完成,随后生成完成且成功后就能自动合并。您还可以指定是否在合并后删除源分支与是否需要squash changes。选择压缩更改的选项会将目标分支的所有提交合并到一个提交中,以帮助在目标分支上保持整洁。

  25. 在这里,我们不会使用自动完成功能,因此请点击取消。

  26. 批准前,可以给Clemri提供一些反馈,如“This looks **good. Way to go @<VSALM\Clemri> :-)”,然后单击Comment**。请注意,这里可以使用markdown和emojis脚本,以及@引用其他用户。您也可以使用#符号连接工作项,例如“#47”。在你输入的时候,下面会有一个实时预览,这样你就可以看到连接的工作项标题。

  27. 选择 Approve | Approve.

  28. 现在所有策略都已完成,请单击CompleteComplete merge以完成此过程。

  29. 将用户切换回 Clemri

  30. 用户Clemri也会看到拉取请求被更新了。