【问题标题】:Keep different content of a particular file in a Git branch在 Git 分支中保留特定文件的不同内容
【发布时间】:2012-05-30 04:51:03
【问题描述】:

我有一个config.php,它假设在不同分支中的内容不同,例如testingmaster

我在另一个问题 (Prevent merging a file from master with Git) 中问过如何防止此文件合并。

但我想知道,这是正确的做法吗?

我相信这是一个很常见的用例,在不同的环境中拥有不同的配置文件,并且您希望对配置进行跟踪,对吧?

【问题讨论】:

    标签: git deployment version-control configuration


    【解决方案1】:

    对于配置文件,一种解决方案是不对其进行版本控制(这样,没有合并问题!)

    你会使用content filter driver:

    你会版本:

    • 一个值文件(用于master 环境)
    • 一个值文件(用于dev 环境)
    • 一个模板文件(带有 @PORT_NUMBER@ 等占位符变量)
    • 一个'smudge'脚本能够基于当前分支和based on the content of the checked out file(这里是模板文件)生成实际的配置文件(仍然是'私有',即未版本化)。
    • 一个“clean”脚本能够检测私有配置文件中的任何值更改,并将这些更改的值存储回(版本化)值文件中。

    【讨论】:

      【解决方案2】:

      执行此操作的经典方法是使用名为 config.yml-dist 的默认配置文件(假设您的原始文件名为 config.yml);您将原始文件添加到 .gitignore 中,并且仅对 dist 进行版本化。
      部署应用程序或重新克隆项目后,只需 cp config.yml-dist config.yml,然后更改所需的设置。

      我在PHP行业遇到的很多人都使用这种方法。

      但是,有一个我更喜欢而且我觉得更简洁:使用环境变量。 示例:

      username: <%= ENV['MONGOID_USERNAME'] %>
      password: <%= ENV['MONGOID_PASSWORD'] %>
      database: <%= ENV['MONGOID_DATABASE'] %>
      

      这样,您将拥有一个版本化的配置文件,而无需编辑一个。

      【讨论】:

        【解决方案3】:

        您可以让主分支不包含该文件,而只将它放在分支中——这是最简单的方法。

        或者,假设主配置相当稳定,否则这将是一个很大的痛苦 - 在每个分支中提交 config.php 更改,然后当您从 master 获得更改时始终使用 rebase 拉取,这样每次都会重新应用配置更改。

        【讨论】:

          【解决方案4】:

          为什么不将所有特定于环境的配置文件存储在主存储库中?然后,无论是在构建还是部署过程中,您都可以使用任何相关的配置文件。有很多不同的实现方式,具体取决于您的构建/部署工具,但无论您采用哪种方式,我认为它都比在分支中更好。

          我的意见是,您肯定希望将配置文件存储在版本控制中并使用部署工具进行部署,这样您就不会因为缺少更新或手动错误而导致旧版本闲置。

          通常存在这样的文件夹结构

          /configurations/test/properties/
          /configurations/prod/properties/
          

          并且部署工具会根据要求在每个环境中使用它们。任何机密信息(例如密码)都可以被散列或加密:像 ansible vault 这样的技术直接支持这一点。

          【讨论】:

          • 通常将包含敏感信息(密码,...)的配置文件放在存储库中是一个非常糟糕的主意。
          • @macjohn 取决于。首先,您的回购可能是敏感的,只显示给内部开发人员,他们应该也需要访问该信息。其次,如果信息确实是敏感的,它不必包含实际信息——它可以包含加密值,根据特定于环境的密钥解密,它可以包含指向实际信息的环境密钥等
          • 我的观点是,在环境变量中设置环境配置(例如服务器名称)是更糟糕的主意。您没有更改的可见性,您无权访问以前的版本等。我可能有点误导,因为所有特定于环境的配置都应该在主仓库中,因为敏感(如密码)应该有可能还有其他措施。
          • 五年后,我仍然同意我的做法。如今,当我们使用 vault 时,这已变得微不足道。但是基本方法没有改变。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-20
          • 1970-01-01
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多