代码之家  ›  专栏  ›  技术社区  ›  Josh

TFS 2008,从源代码管理中移除文件,但将其保留在项目中

  •  5
  • Josh  · 技术社区  · 15 年前

    我们正在使用Scott Hansleman的建议,从他的帖子中获取多个web.config。 here .我们的问题是我们必须检查web.config。如果我们从项目中删除它,那么在发布时,不会推送web.config。因此,我们只需要从web.config中删除源代码管理绑定,但将其保留在项目中,并且将项目的其余部分仍保留在源代码管理下。

    问题是源代码管理使文件在签出之前是只读的。我们需要能够用预构建事件覆盖它,最好不用签出它。是否有一种方法只从该文件中删除绑定,并将其作为项目的一部分保留?

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  9
  •   Tim Booker    15 年前

    通过向解决方案资源管理器添加一个新文件,您将得到一个小加号,指示该文件将被添加到源代码管理中。然后,右键单击并选择“撤消挂起的更改”。这将取消添加,但将文件保留在项目中。

    如果这不起作用,我建议采用以下方法之一:

        2
  •  3
  •   Richard Berg    15 年前

    您应该将文件保留在源代码管理中。否则你会遇到几个问题:

    • 不会对更改进行版本控制。”努夫说。
    • 它不能被分支或合并,即使web.config是最有可能在并行开发/测试/生产环境中发生变化的文件之一。
    • 如果没有手动解决方案,您在本地所做的更改将不会传播给同事。
    • 开发人员第一次设置环境根本无法获取文件
    • 团队构建不包含该文件,因此部署也不包含该文件。(当然,您不是直接从桌面部署的吗?!)

    请注意,单个文件的状态完全存储在TFS服务器上。('tf properties'转储此元数据,如果您好奇的话)只有项目和解决方案具有实际写入文件的绑定。即使这些都是虚拟条目,告诉vs“不要担心我,只要问tfsprovider,它就会知道我是谁和我应该在哪里。”虽然vs项目系统中有许多其他的怪癖,给我无尽的头痛,在这种情况下,它是你的朋友。不要绕开它。

    最佳选择:

    1. 编辑构建脚本以在修改之前/之后切换只读属性。如果你使用的是链接博客文章中的“copyifnewer.bat”脚本,那么它应该是另外一行。即使您希望在msbuild makefile中保持完全声明性的内容,在 3rd party tasks .

    2. 使用文件->源代码管理->排除功能。应用此设置后,文件仍受源代码管理,但不再受活动解决方案的自动签出/签入的影响。换句话说,您可以在不影响任何其他人的情况下,将文件本地编辑到心脏的内容中,但是如果您想提交(或搁置)您的更改,则需要从源代码管理资源管理器或命令行中进行更改。

    选项1的优点是可以快速修复现有设置。缺点来自于维护web.config.*的多个副本。复制/粘贴代码不好的原因相同:如果更改了一个副本,则必须更改所有其他副本——或者更糟的是,忘记并让它们偏离同步,直到奇怪的错误迫使您重新访问该问题。这可以通过更改进程来改进,使只有1个“master”web.config,而其他副本只包含差异(通过文本差异引擎、XSLT转换、PowerShell中的编程操作等)。当然,这是更多的工作。

    选项2避免了1的问题,开销很小。(工程过程本身是不变的;唯一的区别是Visual Studio UI的行为方式)如果您经常更改web.config,那么这种优势是至关重要的。缺点是没有内置的方法来跟踪“主”文件上的变化。如果唯一的区别是非常简单的,例如一两个连接字符串,那么您可能会发现只使用一个“主”并让人们在他们的开发机器上进行特别的更改是最容易的。甚至还有一些工具可以为您做到这一点,例如 Web Deployment Projects (容易)和 IIS Deployment Tool (复合体)。当然,在任何情况下,您的实际部署都应该是自动化的和源代码控制的!如果需要比这些工具能力更重的定制,那么您可能需要前面描述的混合主+转换方法。

        3
  •  0
  •   Michael Welcome    6 年前

    我最近碰到这个问题,找不到一个好的解决办法。经过一次小小的尝试和错误,我自己就能够解决这个问题。

    这适用于Visual Studio 2015。我试着按照上面的答案,但是2015年没有“排除在源代码管理选项之外”我可以找到。它确实具有源代码管理/项目集成,如果您从源代码管理或项目中删除文件,它将自动从这两个位置删除。当您打开包含项目的解决方案时,将强制执行此集成。

    问题是,当使用web.template.config时,web.config实际上是一个生成输出,不应该在源代码管理中。但是,完全删除文件并将其从项目中删除会导致问题,因为该文件不是生成/发布步骤的一部分。

    结果证明,这项工作很简单:

    1. 关闭解决方案。文件-->关闭解决方案。
    2. 在“源代码管理资源管理器”窗口中,删除该文件。
    3. 签入零钱。
    4. 打开您的解决方案,您将看到配置文件保留在项目中。
    5. 您可能会看到三角形/感叹号图标警告,显示找不到配置文件。
    6. 重新生成项目并单击该文件。
    7. 文件现在应该显示而不显示警告。
    8. 它不应该旁边有挂锁图标。这表示它不受版本控制。

    我做了更多的检查,发现了“从源代码管理中排除”功能。关键是,在选择菜单项之前,需要在“解决方案资源管理器”窗口中选择该项:

    1. 在“解决方案资源管理器”中选择web.config文件。
    2. 在菜单中,选择“文件”->“源代码管理”->“高级”->“从源代码管理中排除web.config”。
    3. 现在您将看到一个红色圆圈/白线图标。
    4. 如果文件不在源代码管理中,则可以使用此方法。
    5. 如果该文件已经在源代码管理中,则需要执行上述过程,从源代码管理中删除它,而不同时从项目中删除它。