【问题标题】:Git don't merge specific files (or even lines) when merging branchesGit 在合并分支时不合并特定文件(甚至行)
【发布时间】:2014-07-16 16:22:01
【问题描述】:

首先,我有一种感觉,这已经在其他地方被覆盖了,但是尽管搜索了 SO 和 Google,我还是找不到它。如果这确实是重复的,请随意标记它

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

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

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

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

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

【问题讨论】:

    标签: git merge branch config git-branch


    【解决方案1】:

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

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

    2) 使用 post-receive 钩子执行某些操作,您可以在存储库中的不同位置包含受版本控制的相关不同文件,而不是它们在生产中的位置(并且用户无法访问),将相应的文件移动到该位置。要做到这一点,你必须有一个你想要部署和开发的仓库(一个坏主意 - 见下文)。

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

    【讨论】:

    • 感谢您的周到回复。后处理生产代码似乎是个好主意,但是由于网站相当大且复杂,我觉得现在集成这样的东西根本不值得。因此,看来我有点陷入困境哈哈。 Laravel 的特点是它管理所有你说不属于它的东西——数据库迁移、业务逻辑、服务器配置等等。它应该是一个包,使开发变得快速和容易。
    • 我会再等一会儿,看看是否有其他人提出解决方案 - 如果没有,我会将您的解决方案标记为答案,因为这在考虑所有方面的深度方面绝对出色。
    • 感谢您的夸奖。你是对的,为一个大型项目实施它并不是一件容易的事,它需要一些真正的思考。我从 laravel 网站得到的印象是它是一个完整的解决方案,但只是不确定。我使用类似的 Django,但由于我在迁移到 Django 期间与旧数据库交互并跨越 PHP,所以事情并不那么简单,因此跟踪架构更改、维护脚本、服务器更改(如重定向到替换 URL)等是真的很重要。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2020-11-13
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多