Svn 半可编辑文件(如配置文件)和版本控制-最佳实践?

Svn 半可编辑文件(如配置文件)和版本控制-最佳实践?,svn,version-control,cvs,Svn,Version Control,Cvs,因此,我今天通过签入一个配置文件终止了构建。它知道服务器在哪里(想想SQL server之类的),并且我一直在与运行在我的机器上的服务器对抗。通常,或者更确切地说,在其他情况下,我们会针对中央服务器运行。当然,日常构建没有找到“我的”服务器,因此出现了中断。然后,在签入之前编辑配置文件以指向“正常”服务器,签入之后再次编辑配置文件是一种趋势 我一直想让VC忽略配置文件,这样它就不会被意外签入。另一方面,存储库应该包含一个干净、可用的文件版本。我不可能忽视它,同时让它检查,现在,我可以吗 所以,我

因此,我今天通过签入一个配置文件终止了构建。它知道服务器在哪里(想想SQL server之类的),并且我一直在与运行在我的机器上的服务器对抗。通常,或者更确切地说,在其他情况下,我们会针对中央服务器运行。当然,日常构建没有找到“我的”服务器,因此出现了中断。然后,在签入之前编辑配置文件以指向“正常”服务器,签入之后再次编辑配置文件是一种趋势

我一直想让VC忽略配置文件,这样它就不会被意外签入。另一方面,存储库应该包含一个干净、可用的文件版本。我不可能忽视它,同时让它检查,现在,我可以吗

所以,我要寻找的是一种方法,使文件能够,呃,签出,但永远不会签入。至少在最常见的情况下——如果配置文件发生了重大更改,那么可以执行一些特殊的过程将新版本导入存储库


如果你们以前遇到过这个问题,我会对你们找到的任何解决方案感兴趣。只要他们不破坏构建,就是;)

我使用的一种方法是使用两个版本的配置文件,并让安装程序脚本获取正确的版本

  • settings.xml
  • settings.xml-Release

两个文件都包含相同的键,但其中一个包含“dev”值,另一个包含我们希望在字段中部署和编辑的值。

如果我工作,我们有单独的配置文件用于部署。因此,我们解决方案中的配置文件是开发版本,人们可以根据自己的心意对其进行更改。这些配置文件从未部署到任何地方


部署的配置文件存储在源代码管理提供程序中的单独位置。如果有人需要对配置进行更改并将其部署,他们必须修改此版本。

我们将此类文件存储在源代码管理系统中,并为我们构建的环境设置不同的文件夹

因此,我们:

Dev
Test
Live
这些文件下有其他特定于环境的文件的子文件夹。

我们有

  • *(配置| xml)
  • *(config | xml).cert
  • *(config | xml).生产
Hudson删除初始文件并为正确的环境部署正确的文件(当前仅cert)


这允许开发人员独立记录和开发生产、证书和开发级别的配置文件,并在SVN中分别对其进行版本控制。

您可以做的是保留默认配置文件不变,除非添加了一些新配置。然后,您有一个不同的文件覆盖默认文件的配置

config.Default.xml
config.User.xml
只有config.Default.xml受源代码控制。config.User.xml仅包含与您不同的配置。因此,假设您在本地SQL server上进行测试,您只在其中放入连接字符串,它将覆盖config.Default连接字符串


查看.Net Framwork应用程序配置,它为您完成大部分(如果不是全部)工作。

对于每个配置文件x,创建一个名为x.dist的签入文件,这是默认的分布式配置。开发人员签出后,使用一个脚本将每个x.dist文件复制到x,在那里他们可以根据需要定制x。此脚本可以在重大更改后重新运行以更新文件,或者开发人员可以手动合并其更改

对于部署,您可以签入实时部署文件,并让启动脚本显式引用它们(例如--config x.production)


例如,在如何分发(您必须复制一个模板wp-config.php文件)或在使用autoconf的开发项目中(其中configure.ac已签入,但configure文件必须由每个开发人员生成;在发布时为tarball中的分发构建了一个特殊的configure文件)使用这种方法.

我认为公认的答案是好的,但根据您的要求,它可能有局限性

我们使用以下方法。请注意,我们是使用VS的.NET商店,并使用MSBuild(内置、社区和自定义)任务

  • App.config被版本控制忽略,但包含在项目中
  • App.default.config受版本控制,也包含在项目中。我们不使用硬编码可以更改的东西,例如db连接字符串,而是使用令牌
项目的BeforeBuild任务查找App.config的存在,如果未找到,则将App.default.config复制到App.config。此外,如果App.config存在于CI生成中,则生成服务器始终删除App.config(确保干净配置)。然后,我们还使用MSBuild Community FileUpdate任务根据构建项目的内容将标记替换为适当的值


例如,新开发人员签出可以为本地数据库设置db连接字符串,夜间构建可以为夜间db设置,等等。

接受的答案是好的。但是,如果您的版本控制系统具有变更列表的概念,那么您可以做您想做的事情(4年前),只维护一个签出而从不签入的配置文件。我已经这样做了:

签出配置文件并将其保存在自己的变更列表中。提交时,仅提交其他变更列表;如果将配置文件命名为changelist,比如“donotcommit”,这很容易记住

此系统的一个优点是,如果其他人更改了配置文件的生产版本(即服务器上存在的版本,并且每个人都在维护修改后的本地版本),那么从服务器获取配置文件时,您将收到可能发生冲突的通知。机智