使用带Git的条件配置文件

时间:2014-06-30 20:58:36

标签: git config

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

在Git中是否有某种方法可以有条件地使用一个或另一个文件,具体取决于我所在的分支?

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

3 个答案:

答案 0 :(得分:10)

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

您有几个选择:

版本控制示例配置文件

  • 不要在版本控制中存储特定于环境的数据
  • 创建一个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包含生产值,但不受版本控制。

回购邮件config/database.json中会有.gitignore

版本控制环境特定的配置文件

  • 存储X个不同的配置文件,每个环境一个,称之为config.developmentconfig.production
  • 为您的环境添加符号链接。
  • 将符号链接添加到.gitignore

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

答案 1 :(得分:4)

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

在您的情况下,如果每个分支都在自己的文件夹中签出(git worktree,那么这将有效:请参阅“Multiple working directories with Git”)。

commit 86f9515commit 4aad2f1Nguyễn Thái Ngọc Duy (pclouds)(2017年4月5日) Junio C Hamano -- gitster --于2017年4月24日commit a2e2c04合并)

  

config:添加条件包含

     

有时,一组存储库希望共享配置设置   他们之间不同于其他这样的存储库   用户可以处理两个项目,每个项目都有多个存储库,一个项目使用一个user.email,另一个项目使用另一个项目。

     

设置$GIT_DIR/.config有效,但是如果忘记了惩罚   更新$GIT_DIR/.config很高(特别是当您最终克隆时)   经常),这可能不是最好的方式   在~/.gitconfig中设置只适用于一组存储库的设置在这种情况下不会很好。
  单独${HOME}s可能会增加比解决的问题更多的问题。

     

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

     

在此补丁中,唯一受支持的分组基于$GIT_DIR(in   绝对路径),所以你需要按目录或者分组存储库   类似的东西可以利用它。

     

对于无条件的包含,我们已经include.path   此补丁与 includeIf.<condition>.path 一起使用,以便更清楚地了解条件是否合适   新配置与include.path具有相同的向后兼容性方法:不理解includeIf的旧git版本将   完全忽略它们。

Git 2。14(2017年第3季度)澄清了文件。

commit ce933eb,见commit a076df2commit 994cd6ccommit 9d71d94Jeff King (peff)(2017年5月11日)。
Junio C Hamano -- gitster --于2017年5月29日commit ed98060合并)

The documentation现在读取并包含:

  

     

includeincludeIf部分允许您包含配置   来自其他来源的指令。这些部分的行为完全相同   彼此之间可以忽略includeIf个部分   如果他们的情况没有评估为真;见“有条件的包括”   下方。

相同的Git 2.14强化了这一功能 请commit 0624c63查看Ævar Arnfjörð Bjarmason (avar)(2017年5月16日) Junio C Hamano -- gitster --于2017年5月30日commit b784d0b合并)

  

最近推出的“[includeIf "gitdir:$dir"] path=...”机制已被教导将符号链接考虑在内。

     

$dir”中指定的目录“gitdir:$dir”可能是符号链接   一个真实的位置,而不是$(getcwd)可能返回的位置   在这种情况下,将“$dir”的实际路径与实际路径进行比较   当前存储库,用于确定命名路径中的内容   应该包括在内。

答案 2 :(得分:0)

听起来你可能对hook感兴趣;特别是,看一下post-checkout钩子。基本上,您会编写一个小脚本,根据$(git branch)的值在结账后修改文件。你没有确切地提到需要发生什么,但它可能涉及sed。

您可以将相关文件添加到.gitignore文件中,也可以编写预提交挂钩,以便您的更改不会意外传播到公共存储库。