在Git中使用条件配置文件

在Git中使用条件配置文件,git,config,Git,Config,我经常发现自己在Git中更改项目中的单个变量,以便在开发分支上连接到不同的服务器(在JavaScript中,因此我不能使用预处理器定义) 在Git中是否有某种方式可以根据我所在的分支有条件地使用一个或另一个文件 我不能只使用指定的不同URL提交更改,因为这样做会将其保留在我的提交历史记录中,如果我在合并后稍后在Master上返回该版本,它将具有开发服务器URL。不,没有,但这是一个很好解决的问题 您有几个选择: 版本控制是一个示例配置文件 不在版本控制中存储特定于环境的数据 创建一个confi

我经常发现自己在Git中更改项目中的单个变量,以便在开发分支上连接到不同的服务器(在JavaScript中,因此我不能使用预处理器定义)

在Git中是否有某种方式可以根据我所在的分支有条件地使用一个或另一个文件


我不能只使用指定的不同URL提交更改,因为这样做会将其保留在我的提交历史记录中,如果我在合并后稍后在Master上返回该版本,它将具有开发服务器URL。

不,没有,但这是一个很好解决的问题

您有几个选择:

版本控制是一个示例配置文件
  • 不在版本控制中存储特定于环境的数据
  • 创建一个
    config.example
    文件,列出需要指定的所有配置选项,并为开发提供合理的默认值
  • 克隆您的回购协议的用户应将
    config.example
    复制到真实的配置文件名,并添加真实值
  • 将真实配置文件的名称添加到
    .gitignore
  • 将您的生产凭据存储在git之外,但要进行备份
  • 作为奖励,您可以添加一个
    setup.sh
    脚本,该脚本将
    config.example
    复制到实际配置的位置,并用本地环境的变量填充它
例如,您可能有一个JavaScript应用程序,它需要知道其数据库在哪里,并从
config/database.json
读取此信息。您可以使用如下内容:

// config/database.example.json
DATABASE = {
  "host": "localhost",
  "user": "#TODO",
  "pass": "#TODO",
}
要在开发中运行,您需要将此文件复制到
config/database.json
,并填写适合您的开发环境的值

在生产环境中,您将拥有一个
config/database.json
,其中包含生产值,但不受版本控制

repo将在其
.gitignore
中包含
config/database.json

版本控制环境特定的配置文件
  • 存储X个不同的配置文件,每个环境一个,称它们为
    config.development
    config.production
  • 符号链接适用于您的环境
  • 将符号链接添加到.gitignore

如果配置文件中存在任何远程敏感信息,如AWS密钥或任何形式的密码,则应使用第一个选项-存储配置选项的名称,但不存储其值,并要求用户提供自己的凭据,通过版本控制之外的安全通道获取。

听起来您可能对;具体来说,查看签出后挂钩。基本上,您可以编写一个小脚本,在签出后根据
$(git branch)
的值修改文件。您并没有确切提到需要发生什么,但可能涉及sed


您可以将相关文件添加到
.gitignore
文件中,或者编写一个预提交钩子,这样您的更改就不会意外地传播到公共repo中。

注意,条件包括配置即将到来,从Git 2.13(2017年第2季度)开始。
目前支持的唯一条件是项目名称,而不是主机名

在您的情况下,如果每个分支都在其自己的文件夹中签出(使用:see“”),那么这将起作用

参见(2017年4月5日)作者。
(于2017年4月24日被合并)

config
:添加条件包含 有时,一组存储库希望共享配置设置 它们之间有别于其他此类存储库集。
一个用户可以处理两个项目,每个项目都有多个存储库,并且一个项目使用一个
user.email
,另一个项目使用另一个

设置
$GIT\u DIR/.config
有效,但是如果忘记 update
$GIT\u DIR/.config
的值很高(特别是当您最终克隆时) 通常),这可能不是最好的方式。
~/.gitconfig
中设置只适用于一组存储库,在这种情况下不太合适。
使用单独的
${HOME}
可能会增加更多问题,而不是解决更多问题

扩展允许一个配置文件包含另一个配置文件的
include.path
机制,以便只有在某些条件成立时才能包含该配置文件。
然后,
~/.gitconfig
可以说“include
config-project-A
只有在处理用户处理的每个
项目A
项目A

在此修补程序中,唯一支持的分组基于
$GIT\u DIR
(在 绝对路径),所以您需要按目录对存储库进行分组,或者 像这样的东西来利用它

我们已经有了无条件包含的
include.path

此修补程序带有
includeIf..path
以更清楚地说明需要条件。
新配置具有与
include.path相同的向后兼容性方法:不理解
includeIf
的旧git版本将 简单地忽略它们


Git 2.14(2017年第3季度)对文件进行了澄清

参见,,(2017年5月11日)作者。
(于2017年5月29日被合并)

现在阅读并包括:

包括
include
includeIf
部分允许您包括配置 来自其他来源的指令。这些部分的行为与 除了可以忽略
includeIf
部分之外,其他部分可以相互忽略 如果他们的情况评估不正确;请参阅“条件包含” 下面

同样的Git 2.14强化了这一特性。
参见(2017年5月16日)作者。
(于2017年5月30日被合并)

最近引入的“
[includeIf”gitdir:$dir“]path=…
”机制已经进一步完善