visual-studio - Visual Studio 源代码控制集成如何与 Perforce 配合使用?

标签 visual-studio version-control perforce

我们正在使用 Perforce 和 Visual Studio。每当我们创建一个分支时,除非我们使用“从源代码管理打开”,否则某些项目将不会被绑定(bind)到源代码管理,但其他项目无论如何都可以工作。通过我的调查,我知道其中涉及的一些事情:

在我们的 .csproj 文件中,有以下设置:


  • 有时它们都设置为“SAK”,有时则不是。如果这些说“SAK”,事情似乎更有可能奏效。

    在我们的 .sln 文件中,有许多项目的设置:
  • SccLocalPath#
  • SccProjectFilePathRelativizedFromConnection#
  • SccProjectUniqueName#

  • (# 是标识每个项目的数字。) SccLocalPath 是相对于解决方案文件的路径。经常是“.”,有时是项目所在的文件夹,有时是“..”或“..\..”,指向上面的文件夹好像不好解决方案文件夹。相对化的是从该文件夹到项目文件的路径。如果 SccLocalPath 指向项目的文件夹,它将完全丢失。如果 SccLocalPath 中有“..”,则此路径可能包含分支之间不相同的文件夹名称,我认为这会导致问题。

    所以,为了最终了解我想知道的细节:
  • 执行“更改源代码管理”并绑定(bind)项目时会发生什么? Visual Studio 如何决定在项目和解决方案文件中放入什么内容?
  • 执行“从源代码管理打开”时会发生什么?
  • SccLocalPath 和 SccProjectFilePathRelativizedFromConnection 所指的“连接”文件夹是什么? Visual Studio/Perforce 如何选择它?
  • 是否有一些推荐的方法可以让源代码控制绑定(bind)在您创建解决方案的新分支时继续工作?


  • 2012 年 6 月添加:
    我不再使用 Perforce,所以我不能保证它,但看看下面的 KCD's answer。显然有 a new P4 VS plugin 正在开发中。希望它应该清除所有这些困惑!

    最佳答案

    介绍

    我不同意 Visual Studio 中的 Perforce 集成“可怕”的说法。相反,我将其定义为“开箱即用的体验不是最佳的”:-)。以下部分讨论了我对项目/解决方案设置的集成和建议的理解。

    如果您对源代码控制集成如何工作的细节不感兴趣,可以跳到本答案的末尾,我总结了 Weeble 问题的答案。

    免责声明:以下部分只是基于我的经验经验的有根据的猜测,但是我已经在许多项目中使用该技术多年(每个项目都有多个实验/主干/维护/发布分支​​,有时甚至多个解决方案文件,没有问题)。缺点是您必须手动更新项目文件 - 但 2 分钟的投资在项目的整个生命周期内很好地摊销,恕我直言:-)。

    解决方案与项目

    Visual Studio 在初始解决方案加载期间使用来自解决方案文件和每个项目文件的源代码管理绑定(bind)信息。然后,这个绑定(bind)信息存储在 name.suo 文件(假设我们使用 name.sln 作为解决方案) - 注意文件都标有隐藏标志,以便它们不会在文件中看到资源管理器(除非您覆盖“隐藏文件和文件夹”选项)。

    如果出现任何问题,重新绑定(bind)到源代码控制提供程序的最简单方法是删除相应的 suo 文件并重新打开解决方案。创建 suo 文件后,对 ​​元素的更改无效。

    如果在初始解决方案打开期间,存储在解决方案文件中的绑定(bind)信息与存储在项目文件中的信息之间存在差异,Visual Studio 将尝试修复此问题(有时它甚至会提示您决定选择解决方案中的信息还是项目文件中的信息)项目中的信息应作为解决差异的“主”):

    alt text

    为什么 Visual Studio 违反了 DRY(不要重复自己)原则?我不知道。我认为这有历史原因,并且与称为 Visual Source Safe :-) 的噩梦的需求紧密相关。

    如何“正确”设置?

    向 Perforce 添加新的或现有的解决方案/项目时,我 总是 从创建空白解决方案开始(请参阅“源控制空白解决方案”部分)。然后我将项目一个接一个地添加到这个空白解决方案中。根据要添加的项目是否已存在(请参阅“源代码控制现有(未绑定(bind))项目”和“源代码控制现有(绑定(bind))项目”部分)或我是否需要创建一个新项目,这些步骤略有不同(请参阅“源代码控制新项目”部分)。

    对空白解决方案进行源代码控制

    要将新的空白解决方案添加到源代码管理,请执行以下操作:

  • 启动Visual Studio,“新建”->“项目...”->“其他项目类型”->“空白解决方案”;填写解决方案名称和位置,“确定”按钮
  • "file"->“源代码管理”->“将解决方案添加到源代码管理...”
  • 在连接对话框中输入适当的 P4 服务器端口、客户端和用户(注意所选客户端的 View 必须包括您在步骤 1 中选择的位置)
  • “查看”->“待 checkin ”->“ checkin ”->在提交对话框中而不是点击“提交”按钮,使用“取消”。
    原因 :“ checkin ”操作将创建一个新文件“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 :将在“更改源代码管理”对话框中显示为“服务器绑定(bind)”的任意字符串。此名称用于确定哪些项目/解决方案文件可以共享相同的源代码控制连接。我建议不要为此名称使用空格,因为空格的转义规则在解决方案和项目文件中是不同的。
  • SccProvider0 :硬编码值“MSSCCI:Perforce\u0020SCM”。
  • 使用您选择的 Perforce 客户端(p4.exe、P4Win、P4V)提交两个待处理文件

  • 您现在可以测试绑定(bind):
  • 确保 Visual Studio 已关闭
  • 删除除name.sln(尤其是name.suo)之外的**所有*文件
  • 打开Visual Studio,用它打开name.sln
  • 应出现连接对话框,使用适当的端口/客户端/用户并单击确定
  • 解决方案资源管理器现在应该显示带有挂锁覆盖图标的解决方案节点:
    Source-controlled blank solution
  • 您现在可以使用"file"->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态:
    Source control status of blank solution
    注意:“服务器绑定(bind)”列显示了我们为“SccProjectName0”选择的值。

  • 源代码控制新项目

    如果您正在创建一个全新的项目并希望立即开始在 Perforce 仓库中对其进行跟踪,请按照以下步骤操作:
  • 在Visual Studio中打开源码控制解决方案
  • "file"->“添加”->“新建项目...”-选择您要添加的项目类型、名称和位置(位置应该是存储解决方案文件的目录的子目录)
  • "file"->“全部保存”(这会将所有内存中的更改提交到解决方案文件和新创建的项目文件到磁盘)
  • 使用您选择的编辑器手动编辑您刚刚创建的项目文件(来吧,再次记事本?;-))。将以下属性元素添加到 PropertyGroup(任何属性组)中:
    <PropertyGroup>
        ...
        <SccProjectName>Tutorial</SccProjectName>
        <SccLocalPath>..\..</SccLocalPath>
        <SccProvider>MSSCCI:Perforce SCM</SccProvider>
        ...
    </PropertyGroup>
    

    应按如下方式选择值:
  • SccProjectName - 这是在“更改源代码控制”对话框中显示为“服务器绑定(bind)”的值;应该与您在空白解决方案中用于 SccProjectName0 的值相同;如果不一样,解决方案和这个项目将无法共享相同的源代码控制提供程序连接
  • SccLocalPath - 引用目录的相对路径(在“更改源代码管理”对话框中显示为“本地绑定(bind)”);因为我建议使用解决方案目录作为引用目录,这实际上是从包含项目文件的目录到包含解决方案文件的目录的相对路径(我的示例是将项目存储在“(solutionDir)/Source/ProjectName/projectName.csproj”中,因此相对路径是“向上两级”)
  • SccProvider - 硬编码值“MSSCCI:Perforce SCM”;这用于确定哪些 SCCAPI 提供程序是对
  • 有效的 Scc* 绑定(bind)值
  • 切换回Visual Studio;它应该自动检测到项目文件已在外部更新并提供重新加载它(如果没有,请手动卸载并重新加载项目)
  • “查看”->“待 checkin ”
  • “ checkin ”->我建议右键单击 (solutionName).vssscc 文件并选择“如果未更改则还原”(即使 Visual Studio 打开它进行编辑,它仍保持不变);提供描述并提交更改

  • 验证新添加的项目是否绑定(bind)正确,可以按照以下步骤操作:
  • 确保 Visual Studio 已关闭
  • 删除 (solutionName).suo 文件以及 MSSCCPRJ.SCC(在解决方案目录中)
  • 打开Visual Studio,用它打开(solutionName).sln
  • 应出现连接对话框,使用适当的端口/客户端/用户并单击确定
  • 解决方案资源管理器现在应该显示带有挂锁覆盖图标的项目节点:
    Source-controlled projects
  • 您现在可以使用"file"->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态:
    Status of source-controlled projects

    关于此状态屏幕截图需要注意的一件事是,当我选择解决方案行时,所有剩余的行也都被“选中”(蓝色突出显示)。这是因为所有这些条目都具有相同的“服务器绑定(bind)”+“本地绑定(bind)”,因此共享相同的源控制提供程序 (P4) 连接。

    另请注意,两个项目的“相对路径”有两个级别,并且相对于相同的“本地绑定(bind)” - 解决方案文件所在的目录。

  • 对现有(未绑定(bind))项目进行源代码控制

    如果您有尚未在任何其他 Perforce 解决方案中使用的现有项目,请按照以下步骤将它们添加到 Perforce(即导入之前没有进行源代码控制(Internet 下载等)或正在使用不同源代码控制的项目)提供程序(Visual Source Safe 等)。
  • 将项目复制到合适的位置
  • 清理现有的源代码控制绑定(bind)(如果有):
  • 删除现有的项目文件绑定(bind),即所有以“Scc”开头的属性
  • 删除与项目文件相同目录下的文件(projectName).vspscc(如果有)
  • 在Visual Studio中打开源码控制解决方案
  • "file"->“添加”->“现有项目...”-浏览到项目(您在步骤1中创建的副本)
  • "file"->“全部保存”(这会将所有内存中的更改提交到解决方案文件)
  • 按照“源代码控制新项目”中的步骤 4-7(即,您现在将“Scc*”属性元素添加到 PropertyGroup 0x211421)

    验证步骤与“源代码控制新项目”部分完全相同。

    源代码控制现有(绑定(bind))项目

    如果您的项目已经使用此处讨论的技术绑定(bind)到 Perforce,并且您想在不同的解决方案(新分支、重用项目的替代解决方案等)中使用它们,请使用以下步骤:
  • 将项目集成到所需位置
  • 在Visual Studio中打开源码控制解决方案
  • "File"-> "Add"-> "Existing project..."- 通过集成浏览到在步骤 1 中创建的项目
  • “查看”->“待签到”->“ checkin ”-添加描述并提交

  • 概括
  • 源代码控制绑定(bind)信息存储在解决方案和项目中,必须同步(如果不同步,Visual Studio 将尝试修复任何差异)
  • 我总是将项目文件视为绑定(bind)信息的主要来源,将解决方案文件视为一次性文件,可以通过首先对空白解决方案进行源代码控制然后添加所需项目来轻松重新创建这些文件
  • 解决方案文件应始终具有有效的 SccProvider0 SccProjectName0 0x251819 手动添加新版本的 PccProjectName0 0x251819 的插件值 0x25181924212412312412312312312419
  • 项目文件应该始终有有效的 SccProjectName (如 SccProjectName0 preferrably相同), SccLocalPath SccProvider 值(也必须手动编辑为P4SCC默认是没有好)

  • 我还包括对您原始问题的回答:

    What happens when you do "Change source control" and bind projects? How does Visual Studio decide what to put in the project and solution files?



    这会更新您正在重新绑定(bind)的项目文件中的“Scc*”元素;然后解决方案文件也会更新,以便与项目文件绑定(bind)同步

    What happens when you do "Open from source control"?



    允许您选择要打开的解决方案。之后,解决方案中包含的所有项目都会自动同步到 head。我发现这个功能在 Perforce 世界中不是很有用,在那里你必须创建一个客户端,而且你很可能从 P4V/P4Win/P4 同步这个客户端,而不是依赖 Visual Studio。这在没有 View 概念的 Visual Source Safe 世界中有点有用,并且您正在定义存储库在 check out 时的位置。

    What's this "connection" folder that SccLocalPath and SccProjectFilePathRelativizedFromConnection refer to? How does Visual Studio/Perforce pick it?



    这是 Visual Studio 的簿记。它是根据每个项目文件中的绑定(bind)确定的(我猜理论上如果项目文件由于某种原因丢失了绑定(bind)信息,它可以从解决方案信息中重建......)

    Is there some recommended way to make the source control bindings continue to work even when you create a new branch of the solution?



    我希望以上部分能让您了解一种对我来说非常有效的方法:-)。

    关于visual-studio - Visual Studio 源代码控制集成如何与 Perforce 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261525/

    相关文章:

    linux - ImportError :/usr/local/lib/python3. 7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init

    perforce - P4V 获取最新版本不执行任何操作

    c++ - Perforce 的 C++ P4API 是线程安全的吗?

    visual-studio - 降级 C++ 编译器规范

    c# - Visual Studio 2017 中的 Pythonnet

    c++ - cmake:为静态库的调试构建添加 "d"后缀

    git log --author 没有显示所有提交

    visual-studio - 如何在 Visual Studio 2012 中的大括号之间添加垂直线?

    version-control - 文件名中的 TortoiseSVN/VisualSVN 服务器版本号

    git - 截断 GIT 历史(有 2 个永久分支)