我经常发现自己在Git中的项目中更改单个变量,以便在开发分支上连接到不同的服务器(在JavaScript中,因此我无法使用预处理器定义)。
在Git中是否有某种方法可以有条件地使用一个或另一个文件,具体取决于我所在的分支?
我不能只是使用指定的不同URL提交更改,因为这样做会将其保留在我的提交历史记录中,如果我稍后在Master上合并后再回到该版本,它将具有开发服务器URL。
答案 0 :(得分:10)
不,没有,但这是一个解决得很好的问题。
您有几个选择:
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/database.json
中会有.gitignore
。
config.development
和config.production
等如果您的配置文件中有任何远程敏感信息,例如AWS密钥或任何形式的密码,您应该使用第一个选项 - 存储配置选项的名称,但不存储其值,以及要求用户提供自己的凭据,通过版本控制的外部安全通道获取。
答案 1 :(得分:4)
请注意,条件包括配置即将开始,从Git 2.13开始(2017年第2季度) 截至目前,唯一支持的条件是项目名称,而不是主机名。
在您的情况下,如果每个分支都在自己的文件夹中签出(git worktree
,那么这将有效:请参阅“Multiple working directories with Git”)。
commit 86f9515见commit 4aad2f1,Nguyễ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 a076df2,commit 994cd6c,commit 9d71d94,Jeff King (peff
)(2017年5月11日)。
(Junio C Hamano -- gitster
--于2017年5月29日commit ed98060合并)
The documentation现在读取并包含:
含
include
和includeIf
部分允许您包含配置 来自其他来源的指令。这些部分的行为完全相同 彼此之间可以忽略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
文件中,也可以编写预提交挂钩,以便您的更改不会意外传播到公共存储库。