【发布时间】:2012-04-25 21:34:54
【问题描述】:
我们在不同的办公室有多个开发团队,他们需要为我们项目的web.config 和app.config 文件中的一些配置设置提供不同的值。
我们希望使用一组合理的默认值签入这些配置文件,这样通过签出trunk/master 分支,您就可以工作,而无需四处寻找配置文件。
过去我们使用过 Subversion,特别是 TortoiseSVN,这提供了一种管理本地更改的简单方法:我们只是将这些文件添加到 TortoiseSVN 的自动 ignore-on-commit 更改列表中。这可以防止意外签入这些文件,因为您随后需要专门选择它们以将它们包含在签入中(并且您可以确保您正在签入重大更改,而不是本地配置噪音)。这种方法的主要缺点是配置文件看起来总是“更改”,因此无法一目了然地知道您是否有任何本地更改。
我们正在寻求切换到 Git,并且我正在尝试找出最佳方法。
首先,其他 StackOverflow 答案中已有的内容:
选项 1:签入 xxx.sample 文件并 .gitignore 实际配置文件:建议这样做,例如在 this answer 中。我看到的主要问题是配置文件的更改很容易被遗忘,在两个不同的点:提交者很容易错过他们需要添加到.sample文件的更改,以及消费者(尤其是持续集成服务器)很容易错过他们需要从.sample 文件合并到本地配置文件中的更改。所以基本上,这似乎不是一个很好的解决方案。
选项 2:有一个签入的 xxx.defaults 文件和一个 .gitignored xxx.local 配置文件,它会覆盖它定义的任何设置:这是提供的,例如 here。问题在于我们正在与标准的 .Net 配置提供程序合作 - 我真的不希望我们在 Mirosoft 已经完成所有工作时实现一个全新的设置加载框架。有谁知道获取 app.config 和 web.config 文件以引用可选本地覆盖文件的方法?
选项 3:让开发人员保留本地分支,然后让他们始终将 cherry-picks 或 rebase 分支签入 master,以始终绕过/避免本地分支中不需要的提交:这是作为一个可能的工作流here 提供,虽然我很欣赏它在更改跟踪(所有签入)方面的简洁性,但它在每次签入时引入了大量必需开销;这是一个巨大的痛苦!
选项 4:签入配置文件,但将它们标记为 --assume-unchanged:这是作为一个可能的选项 here 提供的;据我所知,它在精神上与 TortoiseSVN 中的ignore-on-commit 更改列表非常相似,除了在提交过程中您无法看到这些“隐藏”的更改文件;例如,TortoiseGit 确实显示带有“已更改”图标覆盖的文件,但在提交对话框中该文件根本不显示。这似乎有点吓人,又很容易忘记检查更改。
鉴于这些选项,这是我找到的所有选项,我真的希望有一种方法可以选择性地将本地配置文件“包含”到/覆盖签入的 app.config/web.config 文件中,并且选择选项2;有谁知道这样做的方法,或者我缺少的其他选项? (我有点想考虑一个自定义的 Xml 合并预构建步骤......)
我应该在前面提到,我们仍然在 VS2008 上,所以配置转换不可用。
更新:(已删除,完全错误)
更新 2:我已经删除了我之前的更新和回答,这是愚蠢的/没有用。我没有意识到在“我们的”合并之后,另一个方向的下一次合并会将这些文件的“原始”版本带回(覆盖本地分支更改);如果您有兴趣,请参阅编辑历史。这个问题一如既往的开放。
【问题讨论】:
-
你最终采取了什么方法?谢谢。
-
我们最终构建了一个内部工具,如果不跳过太多的圈数,我就无法分享它。它只支持“模板”文件中的占位符,并将其转换为“最终”文件。占位符到值的映射存储在一对简单的 Xml 文档中,一个签入的“默认”文档和一个未签入的“本地”文档 (.gitignored)。模板文件已签入,但所有输出文件都是 .gitignored。它可以运行在“覆盖差异”模式,或“警告差异”模式,您希望使用最终(例如 web.config)文件来更新相应的模板。
标签: .net git configuration web-config app-config