使用git维护特定于分支的配置文件

时间:2016-10-29 07:37:20

标签: linux git version-control configuration

这个问题让我长时间困惑,因为我找不到好的,或多或少的通用解决方案。

假设有两个git分支可用, production dev ;每个使用它自己的可配置参数用于某些任务(即凭证,构建路径,测试/部署脚本切换等)。同时实现脚本&代码对于两个分支都是通用的。

现在,出现的问题是 - 如何在git存储库中以所需的方式维护特定于分支的配置。其中一个常见的解决方案是在git中使用'template'配置文件,symlinking并忽略特定分支的具体内容,例如

$ cat .gitignore | grep conf
/concrete.conf
$ ls -l *.conf
lrwxrwxrwx 1 1000 100 12 Oct 29 10:23 concrete.conf -> generic.conf
-rw-r--r-- 1 1000 100  0 Oct 29 10:16 generic.conf

接下来在开发框中打破并调整 concrete.conf 。然而,这不是我追求的解决方案。

我的要求(好的,愿望)是:

  • 支持每个git分支单独的配置文件,
  • 保持由git同时管理的特定于分支的配置文件

甚至可能吗?可能(实际上,首选是由其他人提供的文件,但它没有相关......)

到目前为止,我想到的最好的方法是使用合并后的挂钩来调整git忽略的其他来源的每个分支配置本身,但它从一开始就很臭

有关解决问题的任何建议吗?

PS:*特定于nix的建议(即使用符号链接/硬链接)建议绝对没问题,我确实对M $目标感兴趣

1 个答案:

答案 0 :(得分:2)

这是可能的,并且不涉及符号链接。

您执行不是版本my.config,而是模板文件my.config.tpl和值文件(每个分支的值)

 prod.conf
 dev.conf

然后,您可以使用content filter driver来使用 .gitattributes declaration

smudge (图片来自" Customizing Git - Git Attributes",来自" Pro Git book")

每次签出分支时,脚本都会生成my.config文件,方法是将占位符值替换为<branch.conf>文件的值。
您可以通过以下方式了解当前分支名称:

branch=$(git rev-parse --symbolic --abbrev-ref HEAD)

生成的实际my.config仍被忽略(.gitignore) 这意味着您的实际工作树不会变得很脏&#34;。

涂抹脚本根据web.config期间应用涂抹脚本的模板选择正确的值文件并生成正确的git checkout

请参阅&#34; git smudge/clean filter between branches&#34;。

中的完整示例