为什么检查门控搁架不会影响挂起的更改?

时间:2014-10-24 04:56:14

标签: tfs tfs2010

我使用几乎空的工作流程来玩门禁签到,只是为了理解内部工作原理。

以下是我的情景:

  1. 进行更改。
  2. 办理登机手续,触发门禁办理登机手续 - 工作流程无效。
  3. 转到与门禁办理登机手续相关联的座席,并与搁置集玩一下 - 见下文。
  4. 所以,我创建了一个新文件(1.txt)并将其签入。更改记录在一个新的shelveset中,现在我要去代理并首先确保没有更改,并且搁置可用:

    PS D:\tfs\DFGatedCheckInTest2> tf status /recursive
    There are no pending changes.
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt -ErrorAction SilentlyContinue
    PS D:\tfs\DFGatedCheckInTest2> tf history ..\..\..\ /version:T /stopafter:1 /recursive /noprompt
    Changeset User              Date       Comment
    --------- ----------------- ---------- ------------------------------------------------------------------------------------------------------------------------
    105631    DAYFORCE\mkhar... 10/24/2014
    PS D:\tfs\DFGatedCheckInTest2> tf shelvesets "Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov" /format:detailed
    ===============================================================================================================================================================
    Shelveset: Gated_2014-10-24_12.09.49.4626
    Owner    : DAYFORCE\mkharitonov
    Date     : Friday, October 24, 2014 12:09:49 AM
    Comment  :
      Adding 1.txt
    PS D:\tfs\DFGatedCheckInTest2> tf status /shelveset:"Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov"
    File name Change User                 Shelveset
    --------- ------ -------------------- -------------------------------------------------------------------------------------------------------------------------
    $/DFDev/mark
    1.txt     add    DAYFORCE\mkharitonov Gated_2014-10-24_12.09.49.4626
    
    1 change(s)
    

    到目前为止一切顺利 - 没有变化,文件不存在且搁置已经准备就绪。现在我搁置了搁置:

    PS D:\tfs\DFGatedCheckInTest2> tf unshelve "Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov" /noprompt
    
    $/DFDev/mark/1.txt:
       opened for add in CANWS212;DAYFORCE\mkharitonov
    Unshelving add: 1.txt
    PS D:\tfs\DFGatedCheckInTest2> tf status /recursive
    File name Change Local path
    --------- ------ ----------------------------------------------------------------------------------------------------------------------------------------------
    $/DFDev/mark
    1.txt     add    D:\TFS\DFGatedCheckInTest2\1.txt
    
    1 change(s)
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        10/24/2014  12:16 AM          0 1.txt
    

    同样,一切都如预期一样 - status命令显示正确的挂起更改并创建新文件。接下来我检查货架:

    PS D:\tfs\DFGatedCheckInTest2>  tf checkin /shelveset:"Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov" /bypass /force
    Changeset #105632 checked in.
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        10/24/2014  12:16 AM          0 1.txt
    
    
    PS D:\tfs\DFGatedCheckInTest2> tf history ..\..\..\ /version:T /stopafter:1 /recursive /noprompt
    Changeset User              Date       Comment
    --------- ----------------- ---------- ------------------------------------------------------------------------------------------------------------------------
    105632    DAYFORCE\mkhar... 10/24/2014 Adding 1.txt
    PS D:\tfs\DFGatedCheckInTest2> tf shelvesets "Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov" /format:detailed
    No shelvesets found matching Gated_2014-10-24_12.09.49.4626;DAYFORCE\mkharitonov
    PS D:\tfs\DFGatedCheckInTest2>
    

    看起来很好 - 文件在那里,一个新的变更集被添加到历史记录中并删除了shelveset。

    但是,这部分我不明白,仍然有待更改:

    PS D:\tfs\DFGatedCheckInTest2> tf status /recursive
    File name Change Local path
    --------- ------ ----------------------------------------------------------------------------------------------------------------------------------------------
    $/DFDev/mark
    1.txt     add    D:\TFS\DFGatedCheckInTest2\1.txt
    
    1 change(s)
    

    为什么???

    我看到摆脱这个待定更改的唯一方法是撤消并明确获取新的变更集:

    PS D:\tfs\DFGatedCheckInTest2> tf undo /noprompt /recursive .
    Undoing add: 1.txt
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt -ErrorAction SilentlyContinue
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        10/24/2014  12:16 AM          0 1.txt
    
    
    PS D:\tfs\DFGatedCheckInTest2> tf status /recursive /noprompt
    There are no pending changes.
    PS D:\tfs\DFGatedCheckInTest2> tf status 1.txt
    There are no pending changes.
    PS D:\tfs\DFGatedCheckInTest2> tf history 1.txt /noprompt
    Changeset Change                     User              Date       Comment
    --------- -------------------------- ----------------- ---------- ---------------------------------------------------------------------------------------------
    105632    add                        DAYFORCE\mkhar... 10/24/2014 Adding 1.txt
    PS D:\tfs\DFGatedCheckInTest2> tf get /version:C105632
    D:\TFS\DFGatedCheckInTest2:
    Getting 1.txt
    PS D:\tfs\DFGatedCheckInTest2> dir 1.txt
    
    
        Directory: D:\tfs\DFGatedCheckInTest2
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -ar--        10/24/2014  12:44 AM          0 1.txt
    
    
    PS D:\tfs\DFGatedCheckInTest2>
    

    在这里,我不明白另一件事。如果我撤消了更改,那么1.txt仍然是版本化的?我在这里取消了什么?

    获取新的变更集会重写文件或仅更改其上次修改时间(从上午12:16到上午12:44),这同样很糟糕。实际上,假设我在不利的情况下建立了数以万计的文件。现在,它们将在下一个gated check-in中再次构建,因为tf get命令突然增加了源文件的最后修改时间戳。 (当然,第二个tf get /version:C105632什么都不做)

    这太糟糕了。我一定很困惑,因为它不能像设计那样。

    请向我解释我在这里遇到的错误。

1 个答案:

答案 0 :(得分:3)

这完全是关于容器,货架和工作空间。

  • 您创建文件并将其提交到shelveset(容器A)。
  • 然后转到构建代理并将Shelveset放入本地 工作区(容器B)
  • 然后你提交shelveset(从容器A到源代码控制) 从容器A签入是成功的,容器A被删除 反映门控Shelveset已经完成了它的生命周期(如果 它失败了它会保持不变)
  • 然后返回到您的代理工作区(容器B) 因为取消了文件,所以没有做任何工作。

所以此时你有一个New文件,TFS注意到它是一个待定的ADD(它在源代码管理中还没有存在(没有其他人可以访问它,它只存在于您的工作区(容器B)中,因为您从容器A签入后没有操作它

撤消文件正在删除工作区Not the same file that was commited from the shelveset中文件的ADD,但现在TFS中的文件名与您在本地工作区(容器B)中的文件名相同。所以TFS做了它认为正确的事情,并用Source Control中的那个替换你的本地文件。

如果您按照标签使用TFS2010,那么这听起来是正确的,您将使用服务器工作区,因此只会检测到已通知TFS的更改/挂起编辑。在2012/2013年,可以使用本地工作空间,可以检测用户在没有通知TFS的情况下完成工作空间的更改。