我们正在使用Perforce和Visual Studio.每当我们创建一个分支时,除非我们使用"从源代码管理中打开",否则某些项目不会被绑定到源代码控制,但其他项目无论如何都可以工作.从我的调查中,我知道一些涉及的事情:
在我们的.csproj文件中,有以下设置:
有时它们都被设置为"SAK",有时不是.如果这些说"SAK",事情似乎更有可能奏效.
在我们的.sln文件中,有许多项目的设置:
SccLocalPath#
SccProjectFilePathRelativizedFromConnection#
SccProjectUniqueName#
(#是标识每个项目的数字.)SccLocalPath是相对于解决方案文件的路径.通常它是".",有时它是项目所在的文件夹,有时它是".."或"..\..",它似乎不好指向上面的文件夹解决方案文件 相对化的是从该文件夹到项目文件的路径.如果SccLocalPath指向项目的文件夹,它将完全丢失.如果SccLocalPath中包含"..",则此路径可能包含分支之间不同的文件夹名称,我认为这会导致问题.
所以,最后要了解我想知道的细节:
当您执行"更改源代码管理"并绑定项目时会发生什么?Visual Studio如何决定将什么放入项目和解决方案文件中?
当您执行"从源代码管理中打开"时会发生什么?
SccLocalPath和SccProjectFilePathRelativizedFromConnection引用的这个"连接"文件夹是什么?Visual Studio/Perforce如何选择它?
是否有一些推荐的方法使源控件绑定继续工作,即使您创建解决方案的新分支?
2012年6月添加: 我不再使用Perforce了,所以我不能保证它,但请看下面的KCD答案.显然有一个新的P4 VS插件正在开发中.希望它能清除所有这些混乱!
我不同意Perforce在Visual Studio中的集成是"非常糟糕"的说法.相反,我将其定义为"开箱即用的体验不是最佳":-).以下部分讨论了我对项目/解决方案设置的集成和建议的理解.
如果您对源代码控制集成的工作方式不感兴趣,可以跳到本答案的末尾,总结Weeble问题的答案.
免责声明:以下部分是基于我的实证经验的有根据的猜测,但是我在许多项目中使用了多年的技术(每个项目都有多个实验/主干/维护/发布分支,有时甚至是多个解决方案文件,没有问题).缺点是您必须手动更新项目文件 - 但是2分钟的投资在项目的生命周期内分摊得非常好恕我:-).
解决方案与项目在初始解决方案加载期间,Visual Studio使用解决方案文件和每个项目文件中的源代码控制绑定信息.然后将此绑定信息存储在name.suo文件中(假设我们使用name.sln作为解决方案) - 请注意,suo文件标有隐藏标志,因此它们在文件浏览器中不可见(除非您覆盖"隐藏"文件和文件夹"选项".
如果出现任何问题,重新绑定到源控件提供程序的最简单方法是删除相应的suo文件并重新打开解决方案.创建suo文件后,对
如果在初始解决方案打开期间,解决方案文件中存储的绑定信息与项目文件中存储的信息之间存在差异,Visual Studio将尝试解决此问题(有时甚至会提示您决定选择解决方案中的信息还是项目中的信息应作为"主人"来解决差异):
为什么Visual Studio违反DRY(不要重复自己)原则?我不知道.我认为这有历史原因,并且与那个叫做Visual Source Safe的噩梦的需求紧密相连:-).
如何"正确"设置?在向Perforce添加新的或现有的解决方案/项目时,我总是首先创建一个空白解决方案(请参阅"源控制空白解决方案"部分).然后我一个接一个地将项目添加到这个空白解决方案中.根据添加的项目是否已经存在,步骤略有不同(请参阅"源控制现有(未绑定)项目"和"源控制现有(绑定)项目"部分)或者我需要创建一个新项目(请参阅"源头控制新项目"部分).
源控制空白解决方案要向源控件添加新的空白解决方案,请执行以下操作:
启动Visual Studio,"新建" - >"项目..." - >"其他项目类型" - >"空白解决方案"; 填写解决方案名称和位置,"确定"按钮
"文件" - >"源代码管理" - >"添加源代码管理解决方案......"
在连接对话框中输入相应的P4服务器端口,客户端和用户(请注意,所选客户端的视图必须包含您在步骤1中选择的位置)
"查看" - >"待检查" - >"签入" - >在提交对话框中,而不是点击"提交"按钮,使用"取消".
原因:"签入"操作将创建一个新文件"name.vssscc",然后将"name.sln"和"name.vssscc"添加到Perforce的默认更改列表中; 通过取消提交对话框,我们将保持"添加"操作未决,并且可以在提交给P4之前编辑文件
关闭Visual Studio
在你最喜欢的编辑器中打开name.sln文件(记事本,如果你真的很绝望:-))并添加两个新行(SccProjectName0和SccProvider0) - 空白解决方案文件现在应该有一个源控件部分,如下所示:
GlobalSection(SourceCodeControl) = preSolution SccNumberOfProjects = 1 SccLocalPath0 = . SccProjectName0 = Tutorial SccProvider0 = MSSCCI:Perforce\u0020SCM EndGlobalSection
值应选择如下:
SccProjectName0:将在"更改源代码管理"对话框中显示为"服务器绑定"的任意字符串.此名称用于确定哪些项目/解决方案文件可以共享相同的源控件连接.我建议不要在此名称中使用空格,因为空间的转义规则在解决方案和项目文件中是不同的.
SccProvider0:硬编码值"MSSCCI:Perforce\u0020SCM".
使用您选择的Perforce客户端提交两个挂起的文件(p4.exe,P4Win,P4V)
您现在可以测试绑定:
确保Visual Studio已关闭
删除除name.sln以外的所有*文件(尤其是name.suo)
打开Visual Studio并使用它打开name.sln
应出现连接对话框,使用适当的端口/客户端/用户并单击"确定"
解决方案资源管理器现在应该使用挂锁覆盖图标显示解决方案节点:
您现在可以使用"文件" - >"源代码管理" - >"更改源代码管理..."来验证解决方案的源代码管理状态: 注意:"服务器绑定"列显示我们为"SccProjectName0"选择的值.
如果您要创建一个全新的项目并希望立即开始在Perforce软件仓库中跟踪它,请按照下列步骤操作:
在Visual Studio中打开源代码控制的解决方案
"文件" - >"添加" - >"新建项目..." - 选择要添加的项目类型,名称和位置(位置应该是存储解决方案文件的目录的子目录)
"文件" - >"全部保存"(这将提交对解决方案文件和新创建的项目文件的所有内存中更改到磁盘)
使用您选择的编辑器手动编辑您刚刚创建的项目文件(来吧,记事本再次?;-)).将以下属性元素添加到PropertyGroup(任何属性组)中:
... Tutorial ..\.. MSSCCI:Perforce SCM ...
值应选择如下:
SccProjectName - 这是"更改源代码管理"对话框中显示为"服务器绑定"的值; 应该与您在空白解决方案中用于SccProjectName0的值相同; 如果不相同,解决方案和此项目将无法共享相同的源控制提供程序连接
SccLocalPath - 引用目录的相对路径(在"更改源代码管理"对话框中显示为"本地绑定"); 因为我建议使用解决方案目录作为参考目录,这实际上是从包含项目文件的目录到包含解决方案文件的目录的相对路径(我的示例是将项目存储在"(solutionDir)/Source/ProjectName/projectName.csproj"中,因此相对路径是"两级以上")
SccProvider - 硬编码值"MSSCCI:Perforce SCM"; 这用于确定哪些SCCAPI提供程序是Scc*绑定值有效
切换回Visual Studio; 它应该自动检测项目文件是否已在外部更新并提供重新加载(如果没有,手动卸载并重新加载项目)
"查看" - >"待审核"
"签入" - >我建议右键单击(solutionName).vssscc文件并选择"如果未更改则还原"(即使Visual Studio打开它进行编辑,它仍保持不变); 提供说明并提交更改
要验证新添加的项目是否正确绑定,您可以按照以下步骤操作:
确保Visual Studio已关闭
删除(solutionName).suo文件以及MSSCCPRJ.SCC(在解决方案目录中)
打开Visual Studio并使用它打开(solutionName).sln
应出现连接对话框,使用适当的端口/客户端/用户并单击"确定"
解决方案资源管理器现在应该使用挂锁覆盖图标显示项目节点:
您现在可以使用"文件" - >"源代码管理" - >"更改源代码管理..."来验证解决方案的源代码管理状态:
有关此状态屏幕截图的一点需要注意的是,当我选择解决方案行时,所有剩余的行也被"选中"(蓝色突出显示).这是因为所有这些条目具有相同的"服务器绑定"+"本地绑定",因此共享相同的源控制提供者(P4)连接.
另请注意,两个项目的"相对路径"有两个级别,并且相对于相同的"本地绑定" - 解决方案文件所在的目录.
如果您的现有项目尚未在任何其他Perforce解决方案中使用,请按照以下步骤将它们添加到Perforce(即导入之前未受源控制的项目(Internet下载等)或使用不同的源控件提供者(Visual Source Safe等).
将项目复制到适当的位置
清理现有的源代码控制绑定(如果有):
删除现有的项目文件绑定,即以"Scc"开头的所有属性
将文件(projectName).vspscc删除到与项目文件相同的目录中(如果有)
在Visual Studio中打开源代码控制的解决方案
"文件" - >"添加" - >"现有项目..." - 浏览到项目(您在步骤1中创建的副本)
"文件" - >"全部保存"(这将提交对解决方案文件的所有内存中更改)
按照"源控制新项目"中的步骤4-7(即您现在将"Scc*"属性元素添加到PropertyGroup中)
验证步骤与"源控制新项目"部分完全相同.
源控制现有(绑定)项目如果您有使用此处讨论的技术绑定到Perforce的项目,并且您希望在不同的解决方案(新分支,重用项目的替代解决方案等)中使用它们,请使用以下步骤:
将项目集成到所需位置
在Visual Studio中打开源代码控制的解决方案
"文件" - >"添加" - >"现有项目..." - 通过集成浏览到步骤1中创建的项目
"查看" - >"待审核" - >"签入" - 添加说明并提交
源控件绑定信息存储在解决方案和项目中,必须同步(如果不是,Visual Studio将尝试修复任何差异)
我总是将项目文件视为绑定信息和解决方案文件的主要来源,作为一次性文件,可以通过首先控制空白解决方案然后添加所需项目来轻松地重新创建
解决方案文件应始终具有有效的SccProvider0和SccProjectName0值(必须手动添加新版本的P4SCC插件)
项目文件应始终具有有效的SccProjectName(最好与SccProjectName0相同),SccLocalPath和SccProvider值(也必须手动编辑,因为P4SCC默认值不好)
我还包括你原来问题的答案:
当您执行"更改源代码管理"并绑定项目时会发生什么?Visual Studio如何决定将什么放入项目和解决方案文件中?
这会更新您重新绑定的项目文件中的"Scc*"元素; 然后更新解决方案文件,以便它与项目文件绑定同步
当您执行"从源代码管理中打开"时会发生什么?
允许您选择要打开的解决方案.之后,解决方案中包含的所有项目将自动同步到头部.我发现这个功能在Perforce世界中并不是很有用,你必须创建一个客户端,你可能会从P4V/P4Win/P4同步这个客户端而不是依赖Visual Studio.这在Visual Source Safe世界中非常有用,在这个世界中没有视图概念,而且您定义了存储库在结帐时间的位置.
SccLocalPath和SccProjectFilePathRelativizedFromConnection引用的这个"连接"文件夹是什么?Visual Studio/Perforce如何选择它?
这是Visual Studio的簿记.它是根据每个项目文件中的绑定确定的(我猜在理论上如果项目文件由于某种原因丢失了绑定信息,它可以从解决方案信息重建...)
是否有一些推荐的方法使源控件绑定继续工作,即使您创建解决方案的新分支?
我希望上面的部分能让你了解一种对我来说非常好的方法:-).
米兰的帖子经过精心研究和写得很好,但它的长度超出了人们对P4SCC模型被打破的疑虑.在项目和解决方案文件中存储源代码控制绑定信息是荒谬的.强制执行(通过sccprojectname)项目只是一个解决方案的一部分同样荒谬.
此外,P4SCC在大型解决方案中具有巨大的性能成本,因为它在启动时从每个文件的源代码控制中检索信息,并在整个开发会话期间在内存中维护该状态.它以无信息.vsscc和vssscc文件的形式创建了额外的内容,以支持Perforce不使用的某些SCC功能(AFAICT).
理想的Perforce集成如下所示:
如果我创建新的解决方案,项目或项目项,请运行"p4 add".
如果我更改了文件,请运行"p4 edit".
一些工具栏/上下文菜单集成了修订历史,修订图,游戏中时光倒流/责备以及"在P4 gui中显示".
(很高兴)如果我重命名库中存在的文件,请运行'p4 integrate'和'p4 delete'.如果我重命名为add添加的文件,请运行'p4 revert'和'p4 add'.
就这样
我们完全摆脱了P4SCC及其奇怪的要求和负担.相反,我们使用NiftyPerforce.有一些错误,但我们发现解决这些错误比解决Perforce < - > VSSCC模型中的设计缺陷更不令人沮丧.
为了保持这一点 - P4VS插件已在2012年左右重写
现在,您可以直接从IDE自然地执行与Perforce的所有日常交互,例如检入代码和查看文件历史记录.
如果你是一个寻求更多功能的超级用户,P4VS不会让人失望.P4VS与Perforce Streams完全兼容,可以从IDE访问Stream Graph以及Time-lapse View和Revision Graph.如果您负责分支管理,您也可以从P4VS合并.
而且,如果您远程工作或想要进行一些私人分支,可以通过P4VS配置P4Sandbox.
perforce.com上的P4VS页面
关于如何使用它的网络研讨会
通过使用P4CONFIG环境变量可以简化使用Perforce和Visual Studio.
基本上你进入Visual Studio,工具 - >选项 - >源代码控制 - >插件设置,高级按钮.这将打开特定于SCC集成的Perforce配置对话框.切换到"连接"选项卡,然后选中标题为"绑定与Perforce环境设置匹配的工作区"的单选按钮.这将告诉perforce更喜欢使用P4CONFIG环境变量来确定您所处的环境.P4V中的编辑 - >首选项中存在相同的对话框,但仅影响p4v的行为.
如何设置P4CONFIG环境变量在某种程度上取决于您.我喜欢让它们在任何地方都被命名为相同,所以我设置了一个系统范围的环境变量P4CONFIG来寻找名为p4config.cfg的文件.此文件只是一个ini样式文件,您可以在其中分配其他变量,如P4USER,P4CLIENT,P4HOST等.Perforce将在当前目录和所有父目录中搜索此文件,直到遇到一个.基本上,您将此文件放在您的clientspec映射到硬盘驱动器上的根目录最多的目录中,并将其保留.
这种方法大大减少了SCC配置在Visual Studio中为了运行而需要的"正确性".(SAK绑定工作正常等)
如果首次将您的代码从perforce同步到完全干净的目录结构,并且获得一个抱怨perforce想要暂时脱机工作或删除绑定的对话框,那么仍然需要进行一些编辑.主要是.sln文件本身需要修改,因此它知道sln有自己的SCC绑定.这是通过确保在.sln文件中的SccNumberOfProjects之后放置以下字段来完成的.
SccProjectName0 = Perforce\u0020Project SccProvider0 = MSSCCI:Perforce\u0020SCM
如果您使用的是P4CONFIG方法,所有单个项目都可以使用默认的"SAK绑定".解决这个问题应该允许Perforce完美地从一个干净的同步工作,并且还消除每个项目目录中MSSCCPRJ.SCC cruft的生成.