如何在构建代理上成功选通门控后正确协调TFS搁置集?

时间:2014-09-22 22:52:04

标签: tfs tfs2010

以下是成功办理登机手续的门禁登记流程的简化版本:

  1. 应用shelveset(构建代理)
  2. 构建(构建代理)
  3. 从工作区恢复Shelveset(构建代理)
  4. 检查门控更改(控制器上的CheckInGatedChanges活动)
  5. 通过检查门控更改获取更改集。 (构建代理)
  6. 这个流程很成问题。实际上,假设用户A提交(提交到门)100个影响解决方案中所有项目的源文件,然后用户B只提交一个影响一个项目的源文件。构建代理上的用户B的门控签入构建有多大?

    答案是用户B将会遭受"遭受"与用户A相同的构建。

    根本原因:我们在检查门控更改之前撤消shelveset,然后再次获取它们,这次是以变更集的形式。这会破坏源文件的时间戳,使它们比刚刚从相同文件生成的二进制文件更新。

    这是一个问题。

    我该如何解决?

    修改

    如果我不恢复搁置集,但立即获得相应的变更集会发生什么:

    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        10/24/2014  10:36 AM         12 1.txt
    
    
    PS D:\tfs\DFGatedCheckInTest2> tf get /version:C105656
    D:\TFS\DFGatedCheckInTest2:
    Conflict 1.txt - Unable to perform the get operation because you have a conflicting edit
    Automatically resolved conflict: edit: D:\TFS\DFGatedCheckInTest2\1.txt as TakeTheirs
    Undoing edit: 1.txt
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -ar--        10/24/2014  11:42 AM         12 1.txt
    
    
    PS D:\tfs\DFGatedCheckInTest2>
    

    注意文件的时间戳。它被撞了上来。我们一无所获。

1 个答案:

答案 0 :(得分:1)

tf get /version:C12345更新时间戳的原因是由于它是2010年的默认行为。这在2012年已更改,并且可以进行配置。

在Visual Studio 2012 / TFS 2012中添加了一个控制文件时间戳的功能,从当时的Brian Harry的帖子中读取:

  

恢复文件修改时间

     

当TFS将文件传输到本地磁盘时,它总是将文件修改时间设置为get操作发生的日期/时间。有一些工作实践存在问题。某些实践使用文件上的日期戳进行增量部署或其他类型的更改管理。 SourceSafe有3个选项用于设置文件的时间戳:

     

获取文件的时间(这是默认设置,与make和其他类似的构建依赖关系跟踪器协同工作非常好)。   签入前上次编辑文件时的修改时间。   签入文件的日期/时间。   TFS 2010及之前仅支持选项#1。在TFS 11中,我们增加了对选项#3的支持。它可以在工作区中按工作区设置。我们计划在未来增加对#2的支持,但尚未到达。

source

返回问题来源

正如您在其他问题中提到的那样,您正在使用tf checkin /shelfset /force,这就是您的问题所在。正如您在其他问题中的答案所解释的那样,该签入直接针对服务器,服务器上的工作空间不受影响,因此留下了搁置相同搁架集的待定更改。

tf checkin /force也非常危险,以防花药开发人员使用旁路选通构建来检查更改。 TFS会假设您知道自己在做什么,并会覆盖这些更改。所以:

  1. 开发者1签入filaA.txt
  2. 构建服务器启动gated checkin
  3. 开发人员2签入fileA.txt并绕过门控签入
  4. 构建服务器完成并使用tf checkin /shelfset /force,从而覆盖开发人员2的更改
  5. 相反,正常的TFS工作流程所做的是检查构建代理程序工作区上的本地更改。 tf checkin $/ /recursive并且它会在构建结束时删除架构集,以便成功构建和签入。

    这告诉构建服务器签入工作区中的本地更改,现在它将知道它具有最新版本,并且不必更新时间戳。下次构建被触发时,构建代理将以get latest开始(以确保还获取任何旁路签入),并且它将知道这些文件已经是最新的。

    因此,通常,您在代理上的工作流程应如下所示:

    1. 如果工作区不存在,请创建工作区和映射
    2. 如果有任何待处理的更改,请撤消它们tf undo $/ /recursive
    3. 执行tf get /recursive /version:T(最新)
    4. 取消搁置到代理的工作区
    5. 构建代码
    6. 签入本地待处理的更改(tf checkin $/ /recursive),不要使用/force
    7. 如果所有这些都成功,请删除shelfset
    8. 如果有任何失败:

      1. 撤消所有挂起的更改以协调工作区
      2. 保持架位
      3. 构建失败。
      4. 这样,本地工作区将更好地反映正在发生的事情,您不必执行tf get /version:c12345来搞乱日期。