下面是我们的门办理入住手续流程的一个成功办理登机手续的简化版本:
- 申请搁置(建立代理)
- 建设(建立代理)
- 从工作区(构建剂)还原搁置
- 检查门的变化(在控制器上CheckInGatedChanges活动)
- 获取变更集是由于在门控的变化检查。 (生成剂)
这种流动是非常有问题的。 事实上,假设用户A提交(提交到门)影响溶液中所有的项目100个源文件,然后用户B提交影响只是一个项目仅有1个源文件。 有多大是门控签入构建在构建代理用户B?
答案是,用户B是要“遭殃”相同的生成与用户A.
根本原因:我们在门的变化检查之前取消搁置,然后再得到他们,这次是在变更的形式。 这颠簸的源文件的时间戳,使他们更新那么这些二进制文件产生了刚才从相同的文件。
这是一个问题。
如何解决这个问题呢?
编辑
如果我不回复搁置,但得到了相应的变更就在这里发生了什么:
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>
请注意文件的时间戳。 它被撞了。 我们一无所获。
之所以tf get /version:C12345
更新时间戳是由于是在2010年。这是在2012年改变,这样配置为它的默认行为。
在Visual Studio 2012 / TFS 2012中增加了一个功能,控制上得到文件的时间戳,从方式布赖恩哈利后回读,则:
恢复文件的修改时间
当TFS获取到您的本地磁盘文件,它始终将文件的修改时间的日期/时间获取操作发生。 也有一些工作做法哪里,这是有问题的。 有些做法使用日期戳上增量部署或其他类型的变更管理的文件。 SourceSafe中有设置上的文件的时间戳3个选项:
该文件得到的时间(这是默认的,而且运作非常良好的音乐会品牌和其他类似的构建依赖跟踪器)。 修改时间,该文件已经在上次签入前编辑。 日期/时间,该文件是在2010年TFS检查,之前只支持选项1。 在TFS 11,我们添加了选项#3的支持。 它可以通过工作区的基础工作区进行设置。 我们计划在未来增加对#2的支持,但还没有得到那里。
资源
回到问题的源头
正如你在你的其他问题提了,你使用的tf checkin /shelfset /force
,这就是你的问题所在。 至于您的其他问题的答案解释,即签去直接对服务器,服务器上的工作区是未受影响,因此被留下unshelving同一shelfset的未决的改变。
tf checkin /force
的情况下也非常危险花药开发商曾使用旁路门建造的变化来检查。 TFS将假设你知道你在做什么,将覆盖这些变化。 所以:
- 开发人员1组将检查
filaA.txt
- 构建服务器启动门控签
- 开发人员2个检查在
fileA.txt
并绕过门控签入 - 建立服务器完成并使用
tf checkin /shelfset /force
,从而覆盖从显影剂2的变化
相反,正常的工作流程TFS做什么,是检查在生成代理的工作区中的局部变化。 tf checkin $/ /recursive
并删除在构建结束时shelfset,在成功的构建和签入的情况。
这告诉构建服务器来检查,在工作区中的局部变化,现在就知道它有最新的版本,不会有更新的时间戳。 下一次构建被触发生成代理将开始获得最新的(以确保任何绕过签入也获取),它会知道这些文件已经是最新的。
因此,在一般的工作流程,在代理,应该是这样的:
- 如果工作空间不存在,创建工作区和映射
- 如果有任何未决的改变,撤消他们
tf undo $/ /recursive
- 执行
tf get /recursive /version:T
(获得最新) - 取消搁置你的shelfset到代理的工作空间
- 构建代码
- 检查本地挂起的更改(
tf checkin $/ /recursive
),不要使用/force
- 如果所有的这是成功的,删除shelfset
如果出现任何故障:
- 撤消所有未决更改调和的工作区
- 留在机智shelfset
- 构建失败。
这样,本地工作区将更好地反映发生了什么事情,你将不必进行tf get /version:c12345
弄乱你的日期。
文章来源: How to reconcile TFS shelveset correctly after a successful gated check-in on the build agent?