在我的Git项目中,我经常需要更改一个变量以连接到不同的服务器,但只是在开发分支上(使用JavaScript编写,无法使用预处理器定义)。
有没有一种方法可以根据我所在的分支条件性地使用一个或另一个文件呢?
我不能只是提交具有不同URL指定的更改,因为这样会把它留在我的提交历史记录中,如果我稍后回到已合并的Master版本中,它将具有开发服务器URL。
在我的Git项目中,我经常需要更改一个变量以连接到不同的服务器,但只是在开发分支上(使用JavaScript编写,无法使用预处理器定义)。
有没有一种方法可以根据我所在的分支条件性地使用一个或另一个文件呢?
我不能只是提交具有不同URL指定的更改,因为这样会把它留在我的提交历史记录中,如果我稍后回到已合并的Master版本中,它将具有开发服务器URL。
没有,但这是一个已经解决的问题。
你有几个选择:
config.example
的文件,列出需要指定的所有配置选项,并为开发提供合理的默认值。config.example
复制到真实的配置文件名,并添加真实的值.gitignore
中。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.development
和config.production
等。为您的环境创建符号链接。将符号链接添加到.gitignore。git worktree
:请参见“使用Git进行多个工作目录”),那么这将起作用。
查看提交 86f9515,提交 4aad2f1(于2017年4月5日)由Nguyễn Thái Ngọc Duy (pclouds
)完成。
(由Junio C Hamano -- gitster
--在提交 a2e2c04中合并,于2017年4月24日)
config
: 添加条件式包含有时,一组存储库想要共享配置设置,这些设置与其他这样的存储库集合不同。
用户可能在两个项目上工作,每个项目都有多个存储库,并为一个项目使用一个user.email
,而为另一个项目使用另一个。
设置$GIT_DIR/.config
是可行的,但如果忘记更新$GIT_DIR/.config
的代价很高(特别是当您经常克隆时),这可能不是最佳选择。
将设置放在~/.gitconfig
中,对于仅适用于一组存储库的情况有效,但在这种情况下效果不佳。
拥有单独的${HOME}s
可能会带来更多问题。
扩展include.path
机制,使配置文件可以包含另一个配置文件,只有在满足某些条件时才能进行包含。
然后,~/.gitconfig
可以说“仅在处理project-A
时包括config-project-A
”对于用户处理的每个project A
。
在此补丁中,唯一支持的分组基于$GIT_DIR
(在绝对路径中),因此您需要按目录或类似方式对存储库进行分组,以利用它。
我们已经有了无条件包含的include.path
。
这个补丁使用includeIf.<condition>.path
来使条件要求更清晰。
新配置采用与include.path
相同的向后兼容方法:不理解includeIf
的旧git版本将简单地忽略它们。
请查看提交ce933eb, 提交a076df2, 提交994cd6c, 提交9d71d94 (2017年5月11日) 由Jeff King (peff
)提交。
(由Junio C Hamano -- gitster
--在提交ed98060中合并,2017年5月29日)
文档现在已经更新并包含以下内容:
包括
include
和includeIf
部分允许您从另一个源包含配置指令。这些部分的行为完全相同,唯一的区别是如果条件不为真,则可以忽略includeIf
部分;请参见下面的“条件包含”。
同样的Git 2.14增强了该功能。
请参考commit 0624c63(由Ævar Arnfjörð Bjarmason(avar
)于2017年5月16日提交)。
(由Junio C Hamano -- gitster --
在 commit b784d0b中合并,于2017年5月30日)
最近引入了"[includeIf "gitdir:$dir"] path=...
"机制,并且进一步考虑了符号链接的影响。
在"gitdir:$dir
"中指定的目录"$dir
"可能是指向实际位置的符号链接,而不是$(getcwd)
返回的内容。
在这种情况下,将"$dir
"的真实路径与当前存储库的真实路径进行比较,以确定是否应包含命名路径的内容。
听起来你可能对hook感兴趣;具体来说,可以研究一下post-checkout hook。基本上,你需要编写一个小脚本,在检出后根据$(git branch)
的值修改文件。你没有明确提到需要发生什么,但很可能涉及sed。
你可以将相关文件添加到.gitignore
文件中,或者编写一个pre-commit hook,以便你的更改不会意外传播到公共repo。