zoukankan      html  css  js  c++  java
  • [转][TFS] 禁止默认允许多人签出和强制解除签入签出锁

    转自:http://blog.xieyc.com/tfs-disable-multiple-check-out-and-force-to-undo-locking/ | 小谢的小站

    [TFS] 禁止默认允许多人签出和强制解除签入签出锁

     

    使用 Visual Studio 2010 Team Foundation Server 进行源代码编辑时,可以对代码实施以下三种锁定之一:

    • Unchanged - Keep any existing lock
    • Check Out - Prevent other users from checking out and checking in
    • Check In - Allow other users to check out but prevent them from checking in

    貌似这个“签出”和“签入”锁的概念很类似于数据库中的“排他锁(独占锁,X)”和“共享锁(S)”的概念。

    下面讨论在使用“签入”和“签出”锁中遇到的两个问题,两者的适用场合有一定对立性。

    一、如何关闭TFS源代码管理的多人签出功能?

    当进行代码的“签出”操作时,可以选择上述三种锁定措施之一,默认是“不改变”;如果直接对代码进行编辑时,会进行自动签出,并默认使用“不改变”的锁定措施。这种措施在多人并发修改代码时,会造成签入时的大量冲突。因此,可能会希望改变TFS的默认选项,对签出的代码强制加上“排他锁”。

    操作方法是:右键选中项目--->团队项目设置--->源代码管理,在弹出对话框的 "签出设置"选项卡中查看以下界面:

    系统默认勾选了“启用多个签出”,我们可以将其去掉;同时注意“启用在签出时获取最新版本”这个选项默认不被勾选,方便起见,可以将其勾选。(注意:该设置会影响回滚版本的操作!因为一般的回滚版本操作为:获取指定版本 - 签出 - 签入 - 解决冲突时保留本地版本。)

    取消“启用多个签出”的选项后,在签出代码时,会默认只能选择施加排他锁:


    二、怎么强制解除签入签出锁(正在编辑)

    网上搜索这个问题的关键字,结果大都是网友“随风飘扬”针对 Visual Studio 2008 Team Foundation Server 所写的一篇维护手记(见文末参考资料列表)。

    下面针对 TFS 2010 的环境,写一下具体应怎么进行强制解除签入签出锁的操作。

    我们在使用TFS的时候会使用到TFS中的SourceControl,SourceControl中的优点我就不用多说了,但是SourceControl有个比较致命的缺点,也是SourceControl基于工作区这种模式下所带来的问题,首先SourceControl源码管理会在每个客户机器上创建一个工作区,然后这个工作区域映射到服务器上的源码文件夹,我们在正常签入、签出的时候,我们的源码会在服务器到客户端的工作区进行操作,这是没有问题的。但是我们在使用TFS的时候基本上都是多人的并发签入签出,而TFS在设计的时候是支持签入锁定与签出锁定的,默认项目组成员在签出项目的时候是不应用任何锁的。即使有项目组成员在把源码项目从TFS的SourceControl中签出,并且加入了签出锁或者是签如锁,这样也无所谓,只要这个项目组的成员按照规矩把这个项目最后在签入到SourceControl中,签出的锁定会自动的解除。

    关键的问题是如果这个项目组的成员喝咖啡去了,或者放假了,或者这个项目组的成员离职了,但是他们在离开前对项目中几个文件施加了签出(入)锁,这时如果项目组的下个成员想要修改被锁定的文件,或者是TFS的管理员想要在SourceControl中删除这个项目,问题就出现了。当我们通过Team Explorer进行操作的时候,Team Explorer会提示有签出(入)锁,然后告诉我们是哪个用户,在哪个工作区进行的锁定。但是我们无法通过Team Explorer图形界面来进行撤出签出操作,只能通过TFS命令:undo来进行操作,强行撤出别人签出的文件。

    首先说明下工作区的定义,一个完整的工作区包括应该包括“WorkSpaceSample;[所在的域]用户名”,用逗号分隔工作区(默认是计算机名)和用户名。(TFS 2008中的工作区定义似乎还包括一个用户序号,即“WorkSpaceSample;[所在的域]用户名[:用户序号]”,不知道 TFS 2010 是否已经将其取消。)

    撤销的步骤如下:

    1、命令行模式进入tf程序所在目录(需要管理员权限)

    cd  C:Program FilesMicrosoft Visual Studio 10.0Common7IDE

    如果是在64位操作系统上安装的,可能是:

    C:Program Files (x86)Microsoft Visual Studio 10.0Common7IDE

    2、用 tf workspaces 命令查找该用户(这里以zwt为例)的工作区完整定义,这里指定了/server参数和/owner参数,如果不指定/owner参数,默认用户名为执行该命令的用户,即查找满足“*;(执行该命令用户名)”的工作区。

    tf workspaces  /server:http://dq311-server:8080/tfs  /owner:zwt

    上述命令执行结果如下(附不使用任何参数的tf workspaces命令执行结果对比)

    3、查看该用户挂起的更改(这里查找用户xyc在任意工作区挂起的更改)

    tf status  /server:http://dq311-server:8080/tfs  /workspace:* /user:xyc

    执行结果(注意服务器的文件路径和文件名分两行显示):

    4、使用tf undo命令强制撤销他的签出,命令如下:

    tf undo /server: TFS服务器URL  /workspace:WorkSpaceSample;[所在的域]用户名[:用户名序号]  $/路径/文件名

    例如

    tf undo  /server:http://dq311-server:8080/tfs  /workspace:HY-PC;hy   $/CTCS/TSAGS_TEAM/TestHY/Program.cs

    如果需要撤销的项目较多,可以使用通配符 * 来代替文件名,以及 /recursive 参数(递归),例如

    tf undo  /server:http://dq311-server:8080/tfs  /workspace:HY-PC;hy   $/CTCS/TSAGS_TEAM/* /recursive

    根据被撤销操作的工作区是否位于执行undo操作的计算机上,结果有两种情况:

    第一种是被undo的工作区正好位于执行该操作的计算机上,则服务器和本地代码可以同时被undo,其效果和在Visual Studio中对文件执行“Undo Pending Changes”一样。

    更多的情况是被undo的工作区不在执行该操作的计算机上,则只能在服务器上撤销操作。

    然后大家就可以刷新你的Team Explorer查看那个加锁的文件,执行Undo操作后,该用户对这个文件的锁定与挂起全部取消了,这样你就可以通过Team Explorer进行修改,或者删除等更多的操作了。

    需要注意的是,上述第二种情况下,虽然“签出”状态已经被撤销了,文件版本恢复到了服务器版本,但是该工作区本地的代码修改并不会被撤销,从而和服务器代码是不一致的!也即“版本一致,实际代码不一致”,这种情况下,在该工作区上执行“获取最新版本”命令也无法更新到服务器版本,只能通过“手动获取指定版本”等方法来解决冲突。(或者也可以等该代码下次版本更新?)

    此外,有几个地方值得说明(部分可能仅适用于TFS 2008):

    1、关于用户名序号

    举个例子,如果你的用户名删除了,然后又新建了一个同名的用户名,那么原有的用户名与工作区的关联还是存在的,所以就会出现两个同名工作区,Work1;WangGi:5,与Work1;WangGi。这样你在操作的时候就可以根据不同的序号来找到对应的工作区了。

    2、如何查看用户名序号

    你可以实用这个命令来查询工作区的完整信息(注意在执行命令的时候有管理员的权限):

    tf workspaces /owner:* /computer:* /server:teamserver2 /format:detailed

    该命令查看当前服务器所有机器上的工作区情况,包含工作区的名字、工作区的ower等,这样你的用户后面的ID就可以看见了。

    3、如果工作区不存在了怎么办?(例如工作区重装系统)

    基本没有影响。

    首先使用命令行模式,显示所有的工作区,然后找到你所要删除的工具删除即可,删除工作区的命令是:

    tf workspace  /delete workspacename;workspaceowner

    例如删除用户dq311在HY-PC上的工作区,命令为:

    tf workspace  /server: http://dq311-server:8080/tfs  /delete HY-PC;dq311

    提示:

    1、如果还有其他问题,建议可以 tf / ?,就会有详细的操作说明出来;

    2、注意 tf workspace 和 tf workspaces 是两个不同的命令。

    三、如何将源代码管理中的代码取出来,让它不包含vssscc扩展名的文件

    这个问题其实和签入签出锁定无关。查阅资料时正好看到了有人问,就顺便记录在这里。

    首先可以通过获取最新版本的项目到本地工作区,然后在解决方案管理器中,点击这个项目的解决方案,然后在文件菜单下的源码管理下的源码管理设置,断开与本地工作区内项目的关联即可。

    参考资料:

    [1] 博客园:随风飘扬:Team Foundation Server 维护手记一(强制解除签入签出锁定)

    [2] http://stackoverflow.com/questions/13014746/tfs-2012-disable-multiple-check-out-not-working

    [3] 强制取消TFS2008中其它成员的签出文件

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/chutianshu1981/p/3695988.html
Copyright © 2011-2022 走看看