使用带Git的条件配置文件

Chr*_*art 7 git config

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

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

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

mea*_*gar 10

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

你有几个选择:

版本控制示例配置文件

  • 不要在版本控制中存储特定于环境的数据
  • 创建一个config.example文件,列出需要指定的所有配置选项,并为开发提供合理的默认值.
  • 克隆您的repo的用户应该复制config.example到真实的配置文件名,并添加实际值
  • 添加真实配置文件的名称.gitignore.
  • 将您的生产凭据存储在git之外,但需要备份,
  • 作为奖励,您可以添加一个setup.sh脚本,该脚本复制config.example到真实配置的位置,并使用本地环境的变量填充它

例如,您可能有一个JavaScript应用程序需要知道其数据库的位置,并从中读取此信息config/database.json.你可以使用这样的东西:

// config/database.example.json
DATABASE = {
  "host": "localhost",
  "user": "#TODO",
  "pass": "#TODO",
}
Run Code Online (Sandbox Code Playgroud)

要在开发中运行,您可以将此文件复制到config/database.json,并填写适合您的开发环境的值.

在生产中,您将拥有config/database.json包含生产值的产品,但不受版本控制.

回购将config/database.json在其中.gitignore.

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

  • 商店X不同的配置文件,每一个环境,给他们打电话config.developmentconfig.production
  • 为您的环境添加符号链接.
  • 将符号链接添加到.gitignore

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


Von*_*onC 7

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

在您的情况下,如果每个分支都在其自己的文件夹中检出(使用git worktree:请参阅“使用 Git 的多个工作目录”),这将起作用。

请参阅Nguy?n Thái Ng?c Duy ( ) 的commit 86f9515commit 4aad2f1(2017 年 4 月 5 日(由Junio C Hamano合并-- --提交 a2e2c04 中,2017 年 4 月 24 日)pclouds
gitster

config: 添加条件包含

有时,一组存储库希望在它们之间共享与其他此类存储库不同的配置设置。
一个用户可能在两个项目上工作,每个项目都有多个存储库,user.email一个项目使用一个,另一个项目使用另一个。

设置$GIT_DIR/.config有效,但如果忘记更新的代价$GIT_DIR/.config很高(特别是当你经常克隆时),这可能不是最好的方法。
在 中设置~/.gitconfig仅适用于一组存储库的设置,在这种情况下效果不佳。
分开${HOME}s可能会增加更多的问题而不是它解决的问题。

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

在此补丁中,唯一支持的分组基于$GIT_DIR(在绝对路径中),因此您需要按目录或类似方式对存储库进行分组以利用它。

我们已经有了include.path无条件包含。
这个补丁includeIf.<condition>.path用来更清楚地说明需要一个条件。
新配置具有与以下相同的向后兼容性方法include.path:不理解的旧 git 版本includeIf将简单地忽略它们。


Git 2.14(2017 年第三季度)澄清了文档。

请参阅Jeff King ( ) 的commit ce933ebcommit a076df2commit 994cd6ccommit 9d71d94 (11 May 2017 )(由Junio C Hamano合并-- --ed98060 中,2017 年 5 月 29 日)peff
gitster

该文档现在阅读并包括:

包括

includeincludeIf部分允许您包括来自其他来源的配置指令。这些部分的行为彼此相同,但includeIf如果它们的条件不为真,则部分可能会被忽略;请参阅下面的“有条件的包含”。

相同的 Git 2.14 加强了该功能。
请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 0624c63(2017 年 5 月 16 日(由Junio C Hamano合并-- --提交 b784d0b 中,2017 年 5 月 30 日)avar
gitster

最近引入的“ [includeIf "gitdir:$dir"] path=...”机制进一步被教导要考虑符号链接。

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