[转][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 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命令执行结果对比)

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中其它成员的签出文件

本文固定链接: http://blog.xieyc.com/tfs-disable-multiple-check-out-and-force-to-undo-locking/ | 小谢的小站

时间: 2024-10-13 00:28:40

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

TFS签入签出规范(转)

最近一个项目,c#+.net3.5做的,代码管理用的TFS,开发小组配备不是很齐全,没有专门的测试人员,加上组员们对TFS不熟悉,有的还是java转过来的,于是整理了一下以前的规范,强制大家执行,看了一下网上的,这方面资料也不多,粘上来献丑了 1)开发平台的约定      a)开发操作系统环境和最终用户使用环境(包含Service Pack版本号) 开发环境:Windows2003SP2      Windows7 用户环境:Windows2003SP2 SP1 WinXP b)开发工具版本 V

JS事件——禁止事件冒泡和禁止默认事件

Event 对象Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.事件通常与函数结合使用,函数不会在事件发生前被执行! 一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,即事件由子元素向祖先元素传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达

TFS强制删除离职人员签出锁定项的方法(转)

项目组一哥们走的时候以独占方式迁出了文件,现在其他人都无法修改,管理员似乎也无法将文件解除.经过摸索,找到了一种暴力的方法——直接改TFS数据库.虽然暴力,却能实实在在地解决这个问题. 步骤: 1.连接到TFS数据库服务器的tfsversioncontrol库: 2.查tbl_workspace表,找出那哥们的工作目录, 如select * from tbl_workspace where workspacename='name' 3.利用上一步查到的workspaceid在tbl_pendin

tfs 禁止多人签出

好久没用tfs了,忘了怎么设置了,记录下 编辑----->高级

LAMP之禁止默认虚拟主机

在httpd-vhosts.conf中,虚拟主机的配置为 <VirtualHost *:80>     DocumentRoot "/data/www"     ServerName www.123.com </VirtualHost> 当我们输入www123.com和自己主机的IP时都是能访问的,在虚拟主机配置文件中加入 <VirtualHost *:80>     DocumentRoot "/tmp/123"     Ser

自己动手丰衣足食,h5手机端jquery弹窗插件(事件冒泡、单例模式、遮盖部分禁止默认滚动)

感谢浏览,欢迎交流=.= 公司开发微信网页多处需要使用弹窗,使用jquery-ui的定制化下载仍需要150多kb,想来有些奢侈(最终下来只有11kb,压缩后2kb,啊,我的神), 手机端弹窗方式与pc端有些不同,而且手机上有一个弹窗出来滚动跟父页面滚动相互影响的问题, 于是决定写一个插件,专门对付手机网页的弹窗. 弹窗的mask和dialog两部分都做成了position=fixed,比较喜欢这种效果,并且屏蔽了被遮住部分的滚动. 几处认为需要留意的知识点或困难点: 1.事件冒泡: e.prev

软件测试典型问题记录-修改窗口页面存在两个页签,修改后在某个页签点确定,另一页签内容未修改

容易忽视的问题记录 修改页面大概如下: 问题:修改完成后,在页签1,点击确定,修改无误: 在页签2,点击确定,页签1中的内容未做修改.

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1.正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使用不慎,我们就会为一次字符串的操作所带来的额外性能开销而付出代价.本条建议将从两个方面来探讨如何规避这类性能开销: 1.确保尽量少的装箱 2.避免分配额外的内存空间 先来介绍第一个方面,请看下面的两行代码: String

题目: 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(用C语言)

#include <stdio.h> #define M 15   //M表示人数,N表示报号退出的数字 int main() { int  str[M]; for(int a = 0;a<M;a++)   //for循环赋值 { str[a]=a+1; } int number = M,count = 0,i =0; while (number > 1)  //直到只剩一人退出循环 { if (str[i] != 0)//最后没有的时候就不用计算了 count++; if (co