2014-07-16 23 views
2

首先,我有一种感觉,这已经被其他地方覆盖了,但是尽管搜索到了SO和Google,我仍然无法找到它。如果这确实是重复的,请随时标记为合并分支时,Git不会合并特定文件(或者甚至行)

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

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

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

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

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

回答

1

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

1)制作单独的新闻稿树/分支,其中的更改保存到主不了那里进行,刚刚创建的文件中的差异您希望进行开发与生产,在其他地方开发,将更新推送到孤立的树中并将其用于部署。如果最终编辑会导致未合并文件发生冲突,则必须手动编辑以合并它们。很明显,这不是很好,因为某些东西永远不会被检入主人。

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

这些确实是我能想到的唯一两个,我重新回顾了有关您的问题的git文档,但找不到其他内容,但使用适当的构建工具会更好。这是这些类型的工具和你的评论的目的“或甚至更好,让它忽略配置文件中的特定行?”只是尖叫使用依赖于构建的定义来根据标志创建所需的行。作为构建过程的一部分,您可以另外加入诸如语法检查器(JShint),网页代码最小化器(Google Closure)或静态页面模板(wpp)之类的东西 - 我对laravel一无所知,所以也许这些都没有帮助,这只是一些一般的想法 - 虽然有些人可能不需要编译代码,但我不得不说这是一个短视的想法。当您在这方面将代码库与部署分开时,它还有助于管理对您的网站而言可能非常重要的事物,这些事物也不属于Web访问框架,如服务器配置,数据库迁移,cgi脚本等。

+0

谢谢你的深思熟虑的回应。后处理生产代码似乎是一个好主意,但是由于网站相当庞大而且复杂,我有一种感觉,像现在这样整合这样的东西根本不值得。因此,看起来我有点陷入困境,哈哈。关于Laravel的一点是它可以管理所有你认为不属于它的东西 - 数据库迁移,业务逻辑,服务器配置,e.t.c.它应该是一个可以使开发变得快速和简单的软件包。 –

+0

我会多等一会儿,看看是否有其他人提出了解决方案 - 如果不是,我会将你的答案标记为答案,因为这在考虑所有事情方面都非常出色。 –

+0

感谢您的夸奖。你是对的,在一个大型项目中实施它并不是微不足道的,它需要一些真正的想法。我从laravel网站那里得到了这个解决方案的完整解决方案,但不确定。我使用的Django类似,但由于我在迁移到Django的过程中与旧数据库接口并跨越PHP,事情并非如此简单,因此跟踪模式更改,维护脚本,服务器更改(如重定向到替换URLS)等非常重要。 – Jmills

0

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

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

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

我在一些脚本中合并:https://github.com/keepitfree/faithfulgit