以下是成功办理登机手续的门禁登记流程的简化版本:
这个流程很成问题。实际上,假设用户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>
注意文件的时间戳。它被撞了上来。我们一无所获。
答案 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的支持,但尚未到达。
正如您在其他问题中提到的那样,您正在使用tf checkin /shelfset /force
,这就是您的问题所在。正如您在其他问题中的答案所解释的那样,该签入直接针对服务器,服务器上的工作空间不受影响,因此留下了搁置相同搁架集的待定更改。
tf checkin /force
也非常危险,以防花药开发人员使用旁路选通构建来检查更改。 TFS会假设您知道自己在做什么,并会覆盖这些更改。所以:
filaA.txt
fileA.txt
并绕过门控签入tf checkin /shelfset /force
,从而覆盖开发人员2的更改相反,正常的TFS工作流程所做的是检查构建代理程序工作区上的本地更改。 tf checkin $/ /recursive
并且它会在构建结束时删除架构集,以便成功构建和签入。
这告诉构建服务器签入工作区中的本地更改,现在它将知道它具有最新版本,并且不必更新时间戳。下次构建被触发时,构建代理将以get latest开始(以确保还获取任何旁路签入),并且它将知道这些文件已经是最新的。
因此,通常,您在代理上的工作流程应如下所示:
tf undo $/ /recursive
tf get /recursive /version:T
(最新)tf checkin $/ /recursive
),不要使用/force
如果有任何失败:
这样,本地工作区将更好地反映正在发生的事情,您不必执行tf get /version:c12345
来搞乱日期。