协作时如何管理配置文件?

62
我正在编写一个简短的脚本,页面顶部有几个简单的变量。我想要和朋友一起处理这些变量,但我们不确定如何管理需要在每次拉取后更改的变量,以免为其中一个人添加不必要的内容到 git 状态中。我考虑创建不同命名的分支供我们使用,然后主分支只保留示例用户名,但是合并时需要做很多额外的工作,所以这种方法似乎有点冗余。我们可以将变量作为选项传递给脚本,但这并不理想,也不希望将其分离到另一个单独的配置文件中。最好能够像 .gitignore 一样,只忽略文件中的几行内容。
如何优雅地解决这个问题?通常是如何处理此类问题的?

1
为什么你的脚本不能从另一个文件中读取这些变量,然后将其添加到.gitignore中?你可以有不同版本的这个变量文件。 - Vadim
可能是提交机器特定配置文件的重复问题。 - Senseful
6个回答

69

很抱歉,您无法轻易忽略文件中特定行的更改,因此您可能需要使用单独的配置文件。以下列出了两种常见的处理方式和一种稍微奇特的方式:

在git中保留示例配置文件

在这种情况下,您将在git中保留一个名为config.sample的示例文件,但应用程序实际上会使用一个名为config的文件中的值,并且该文件在.gitignore中。然后,应用程序将产生错误,除非存在config文件。当您向个人config文件添加新的配置变量时,您必须记得更改示例文件中的值。在这种情况下,最好让应用程序检查是否已经设置了所有必需的配置变量,以防有人在对示例进行更改后忘记更新其config文件。

在git中保留默认值文件

您可以在git中保存一个名为config.defaults的文件,其中包含尽可能合理的默认配置值。应用程序首先从config.defaults获取配置,然后再从config(位于.gitignore中)获取配置,以覆盖任何默认值。使用这种方法,通常不会使config不存在成为错误,因此应用程序可以在没有创建config的情况下即可使用。

使用一个配置文件并使用--assume-unchanged参数

第三种可能性,个人不建议在这种情况下采用,那就是有一个单独的配置文件提交到git中,但使用git update-index --assume-unchanged <FILE>命令告诉git忽略它的更改(可以参考这篇有用的博客文章)。这意味着您对配置文件的本地更改将不会随git commit -a提交或出现在git status中。

1
对于示例配置文件解决方案,人们总是会忘记在更新本地配置文件后更新示例文件,因为他们可以使用本地配置文件成功运行。 - Cloud
在生产和开发分支上,您可以同时执行#2和#3,以便根据分支具有不同的覆盖。这应该有助于连续集成环境或构建脚本。 - Dmitri R117
1
告诉git忽略对它的更改——这不是assume-unchanged的作用:'假设未更改不应被滥用为忽略机制。它是“我知道我的文件系统操作很慢。我承诺Git我不会更改这些路径……”特别是,这不是一个承诺……如果Git可以确定路径已经发生了变化而不需要额外的lstat(2)成本,它[可以]报告该路径已经被修改(…git commit -a可以自由地提交该更改)。' - Chris

7

针对Python/Django的解决方案是拥有一个共享的settings.py文件,将其检入仓库,并在settings.py末尾导入本地的settings_local.py,用机器特定的值覆盖部分设置。


5
在我的情况下,我有一个名为“config”的变量,它在一个单独的(小)文件中,团队中的其他开发人员也是如此。像我的数据库位置等内容都保存在那里。我们将这个文件的名称放在我们的.gitignore中,以便它不受版本控制,但是我们会提交一个“sample_config”文件,让新手可以复制并用于自己的目的。

1
希望这个答案仍然有用...我有一个问题...你怎么更新这两个文件呢?每次开发者向“小”文件添加一个键时,都要将其添加到样本中。现在其他开发人员如何知道样本中添加了新的键,并需要更新他们的“小”文件呢?能否请你为我澄清一下这个问题? - elvainch
如果这是每个人都需要的东西,那么示例文件中会有相应的虚拟值。其余的则需要进行适当的团队沟通。 - Noufal Ibrahim
在一个大团队中,你会如何管理它?还有适当的团队沟通方式? - elvainch
1
我无法提供具体的建议。这取决于团队的规模和性质。一个可靠的方法是确保测试能够及早发现问题,这样当人们进行更新并运行测试时,他们的设置就会崩溃。 - Noufal Ibrahim

2

其他选项(不太优雅但可能有用):

  • 使用git stashgit stash pop来处理您的配置文件
  • 创建一个名为config的分支,其中包含您本地的配置文件更改,然后使用git checkout config <your config file>

如果您需要在仓库中保留本地配置更改,则第二个选项很好。


Git stash非常适用于早期开发阶段,但我建议尽快采纳Mark的建议,特别是#2和/或#3。 - Dmitri R117

0
现在我在Python/Django中使用ENV变量,你也可以为它们添加默认值。 在Docker的上下文中,我可以将ENV变量保存在docker-compose.yml文件或一个在版本控制中被忽略的额外文件中。
# settings.py
import os
DEBUG = os.getenv('DJANGO_DEBUG') == 'True'
EMAIL_HOST = os.environ.get('DJANGO_EMAIL_HOST', 'localhost')

如果这些环境变量不是直接针对于Django的,那么它们应该以您的应用程序名称为前缀,例如 MYAPP_DJANGO_DEBUGMYAPP_DJANGO_EMAIL_HOST。如果它们是直接针对于Django的,那么当然可以不需要前缀。 - Asclepius

0
我有几个类似这样的简短脚本,而不是创建单独的配置文件,我会创建一个单独的setenv.sh(或setenv.bat)文件。将少量简单变量移动到这个新文件中,并在主脚本中调用setenv.sh文件。每个用户都不会更改的变量保留在主脚本中。根据setenv.sh脚本的大小,我要么编写有关如何创建此setenv.sh的文档,要么提交一个setenv.sh.sample作为模板。
这种变化是不创建或调用setenv.sh,让用户设置在主脚本中使用的环境变量。如果变量不存在,主脚本将抱怨。
一些简短的脚本会变成大型脚本或成为完整的应用程序。当这种情况发生时,我会采用配置文件的方式。我们有一个管理配置文件的应用程序叫Config,位于http://www.configapp.com。Config有环境和实例的概念。在您的示例中,您有1个本地环境和2个实例。公共变量放入本地环境中,机器特定变量(您和您的朋友)放入实例中。这对于小型脚本来说有点过于复杂,但对于应用程序来说非常有效。

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