合并分支时,Git不会合并特定文件(甚至行)

时间:2014-07-16 16:22:01

标签: git merge branch config git-branch

首先,我觉得这已经被其他地方所覆盖,但是尽管搜索了SO和Google,但我无法找到它。如果这确实是重复的,请随时将其标记为

我的基于git的网站目前由两个分支组成 - 开发和生产。 (我目前是团队中唯一的开发人员,因此我没有打扰创建发布分支)

我的项目是在MVC框架(laravel)之上完成的,我希望有依赖于分支的文件(当我将开发合并到生产中时不要更新这些文件)。

例如,在生产分支中,配置文件设置为在发生服务器错误时不输出调试信息,而在开发分支中我希望它输出调试信息。

因此,是否有可能让git忽略配置文件等特定文件?或者甚至更好,让它忽略配置文件中的特定行?

请注意,这是一个网站 - 不是一个小项目。

2 个答案:

答案 0 :(得分:1)

我很确定没有,至少没有相当大的努力。这个想法有点混淆了git等版本控制软件与makeSCons之类的构建软件之间的目的。通常,您希望在托管存储库中构建/部署所有内容,然后使用构建来管理捆绑/部署。听起来你正在管理一个网站存储库,它似乎不是make的一个很好的候选者,这也是我实际使用SCons来管理网站部署(生产和开发)的原因。强烈推荐它。如果你真的想在没有合适的构建软件的情况下做到这一点,你可以通过以下方式进行管理:

1)制作单独的发布树/分支,其中保存到主服务器的更改永远不会在那里执行,只需在开发与生产相关的文件中创建差异,在其他地方开发,将更新推送到隔离的树中使用那些进行部署。如果最终编辑会导致未合并文件发生冲突,则必须git stash并可能手动编辑以合并它们。显然这不是很好,因为某些事情永远不会被检查到主人。

2)使用post-receive hooks做一些事情,你在存储库中的不同位置包含版本控制下的相关不同文件,而不是它们在生产中的位置(并且用户无法访问),将适当的文件移动到该位置。要做到这一点,你必须有一个你想要部署的回购和你开发的地方(一个坏主意 - 见下文)。

这些是我能想到的唯一两个,并且我重新审阅了关于你的问题的git文档,并且找不到其他的东西,但是使用正确的构建工具会好得多。这些类型的工具的目的和你的评论"甚至更好,让它忽略配置文件中的特定行?"只是尖叫使用依赖于构建的定义来根据标志创建所需的行。您还可以将语法检查器(JShint),Web代码最小化器(Google Closure)或静态页面模板(wpp)等内容合并到构建过程中 - 我对{{{ 1}}所以也许那些没有帮助,它只是一些一般性的想法 - 所以虽然有些可能think it's ok to push web files into production straight from git并且构建对于不需要编译的代码不是必需的,但我有说这是一个短视的想法。在这方面,当您将代码库与部署分开时,它还有助于管理对您的网站至关重要的内容,这些内容也不属于Web可访问的框架,如服务器配置,数据库迁移,cgi脚本等。

答案 1 :(得分:0)

我找到了解决方案(至少对于分支相关文件)

1)创建一个自定义合并驱动程序,忽略相应文件的合并冲突。必须在.gitattributes

中为每个文件注册驱动程序

2)在该文件中的每次提交时创建合并冲突(否则,合并是微不足道的,并且不会使用合并驱动程序)。这可以通过.git / hooks / post-commit中的提交后挂钩来完成,它在每次提交后在每个分支中更改该文件。

我在一些脚本中加入了https://github.com/keepitfree/faithfulgit