Git最佳实践:针对配置文件等的处理方式

59

我对git方面的一切仍然很陌生,想知道有关配置文件的最佳实践是什么。我的本地开发服务器需要不同的配置值与我的线上服务器不同,那我该如何阻止它推送/拉取这些文件呢?


2
将这些文件包含到.gitignore中。 - Luka Rahne
5个回答

51
使用符号链接。以一个名为"config.ini"的配置文件为例,在git仓库的工作目录中,您需要执行以下操作:
1. 创建一个名为"config-sample.ini"的配置文件的版本。您将在这个文件上进行所有的工作。 2. 在"config.ini"和"config-sample.ini"之间创建一个符号链接。
ln -s config-sample.ini config.ini

即使你实际上在维护 "config-sample.ini" 文件,使用这种方法可以让你所有的代码都指向 "config.ini"。

  • 更新你的 .gitignore 文件以防止存储 "config.ini"。也就是说,添加一个 "config.ini" 行:

  • echo "config.ini" >> .gitignore
    
  • (可选,但强烈建议)创建一个.gitattributes文件,并在其中添加一行"config.ini export-ignore"。

  • echo "config.ini export-ignore" >> .gitattributes
    
  • 进行一些编码和部署......

  • 将代码部署到生产环境后,将“config-sample.ini”文件复制到“config.ini”。您需要进行必要的调整以设置生产环境。您只需要在第一次部署时执行此操作,并且每当更改配置文件的结构时都需要执行此操作。

  • 一些好处:

    • 你的配置文件结构会在版本库中得到维护。

    • 可以为任何在开发和生产环境之间相同的配置选项设置合理的默认值。

    • 每当您推送新版本至生产环境时,“config-sample.ini”将更新。这样更容易发现您需要在“config.ini”文件中进行的更改。

    • 您永远不会覆盖生产版本的“config.ini”。(.gitattributes文件的可选步骤4会增加一个额外的保证,即即使您意外添加它到版本库中,也永远不会导出“config.ini”文件。)

    (此方法在我的Mac和Linux上运行良好。我猜在Windows上可能有相应的解决方案,但其他人需要发表评论。)


    26

    有多种选择:

    1. 提交一个默认配置文件,但允许使用本地配置文件

    将文件default.conf添加到您的Git存储库中。

    您的应用程序首先查找app.conf,但如果不存在,则使用default.conf

    想要非默认配置的用户可以将default.conf复制到app.conf然后进行编辑。

    用户不应该将app.conf提交到存储库中,因为不同的用户可能希望在该文件中设置不同的设置。(因此,您应该将app.conf放入您的.gitignore中。)

    带有变化的方式(推荐)

    您的应用程序始终加载default.conf,但如果存在app.conf,则会将设置app.conf复制到default.conf

    这个变化有几个优点:

    • app.conf只需要保存与默认值不同的内容,使其更小且易于维护。

    • 当应用程序更改时,添加到default.conf的新默认值将可供应用程序使用,而无需用户将它们复制到app.conf中。

    这个解决方案与Alan W. Smith上面的答案非常相似,只有一个小区别:如果应用程序可以在没有存在app.conf文件的情况下启动,则它将开箱即用。但是,它确实增加了一些复杂性到应用程序的启动代码。

    该建议是Linus Torvalds在git或内核邮件列表上提出的几个建议之一,但我今天找不到它了。

    2. 使用环境变量和/或命令行参数

    您可以使用环境变量来指向应用程序特定的配置文件。您可以像这样启动应用程序:

    CONFIG_FILE=test.conf ./start-app
    

    或者,另一种选择是:

    ./start-app --config=test.conf
    
    这意味着您可以拥有多个配置文件,例如development.confstaging.confproduction.conf。当您启动应用程序时,告诉它使用哪个配置文件。

    希望尝试不同配置的开发人员可以指向他们自己的文件,例如custom.conf

    您还可以使用环境变量或命令行参数来覆盖特定的设置:

    ./start-app --config=default.conf --db-url=... --debug-level=5
    

    3.不同的分支

    您可以在主分支中保留默认配置。

    为每个不同的环境分叉出不同的分支。

    每个分支可以根据需要修改默认配置文件。

    当主分支更新时,从主分支合并到您的特定分支。

    个人而言,我不推荐这种方法。 我认为这样更难维护。

    配置文件的标准位置

    每个操作系统都有不同的推荐存储配置文件的位置。

    • 对于用户应用程序,请参考此页面

      根据您使用的编程语言,您可能还会找到帮助解决此问题的库。 (C,C ++PythonR)

    • 对于系统服务,配置将位于不同的位置。

      例如,在Linux上:/etc/default/app_name/etc/app_name/something.conf


    1
    我真的很喜欢#1。我已经成功地使用和消费了这个模式。谢谢你的答案 - 我希望它能超过第一 =P。 - Parrhesia Joe
    肯定是第三个选项,适用于更复杂的环境进行自定义!当然,更难维护 - 因为情况本身会带来更多问题。 - andreagalle

    7
    Git会忽略您没有显式添加的文件,因此在检出不同分支时,它们仍然保持在目录结构中,而其他文件则会随着更改而发生变化。如果您将配置文件添加到存储库根目录中的.gitignore文件中(可能需要创建它,更多信息在这里),那么您仍然可以执行所有文件命令。
    git add .
    

    如果您想要做到这一点而不必担心它。


    3
    最好的方法是创建一个名为 .gitignore 的文件,并插入想要忽略的文件/文件夹。
    这样,您可以每次使用 git add * 命令。

    1

    我一直将默认配置文件命名为另一个名称,例如rename_to_config.ini。程序尝试读取config.ini,如果不存在则返回错误。

    优点:

    • 我可以将真正的config.ini保留在.gitignore中,并且不会随git add .添加。
    • 您可以确认用户必须考虑配置文件,以防它具有像数据库信息这样的强制字段。

    缺点:

    • 用户无法立即使用默认配置运行程序。
    • 可能不是非常标准的做法。

    1
    根据您的构建脚本,您可以在首次使用时生成它,或在安装时自动部署它。甚至可以使用符号链接并忽略它。 - undefined

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接