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

时间:2023-07-17 08:13:14

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

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

作者:xieyc   发布:2013-07-03 10:20   字符数:3925   分类:编程   阅读: 8,134 次   抢沙发  

使用 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的默认选项,对签出的代码强制加上“排他锁”。

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

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

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

[转][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 Files\Microsoft Visual Studio 10.0\Common7\IDE

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

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

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

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

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

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

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

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

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

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

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”一样。

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

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

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

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

然后大家就可以刷新你的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://*.com/questions/13014746/tfs-2012-disable-multiple-check-out-not-working

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