将文件的特定行合并为“我们的”,其余的合并为“他们的”

时间:2018-07-16 14:19:04

标签: git merge git-merge git-config

设置

我有一个项目存储库;我们称之为foo。 我在存储库中有一个特定的文件;我们称之为bar。 我在foo有两个分支; master用于开发,public用于稳定版本。

工作流程

我在master中进行更改,在此处进行测试,如果它们在测试中仍然存在,请将其合并到public中。假设我当前正在使用bar这个程序,它可以在屏幕上显示视觉内容,并且需要花费一定的时间才能运行。为了减少测试期间的运行时间,我通常会调整几个参数,以便它不会在整个持续时间内运行,而只能运行一部分。

问题

我希望master反映public的许多变化;但是,在master中,我不想在合并之前(或之后)将所有参数都更改回默认的面向用户的参数。我知道[1]这些参数所在的行,以及[2]列表正则表达式模式,这些行将与之匹配。

有没有一种方法可以为此特定存储库配置git-merge,使其始终合并为那些特定行的ours,这样我的参数和配置就不会被覆盖?

1 个答案:

答案 0 :(得分:1)

这实际上是“我可以忽略合并中的某些更改”的一种变体,通常问这个问题的目的是在每个分支上保留针对不同环境的配置(这基本上也可以归结为该问题)。

基于行号或正则表达式来决定如何管理合并的工具最终将不得不做出假设,而通用工具将很难验证这些假设。因此,我认为git本身不尝试支持这种功能是合理的。如果您知道这样的假设对您有用,那么您可以编写符合您需要的合并驱动程序。

如果您可以安排事情以便您要合并的更改永远不会与您不想合并的更改位于同一个文件中,则将更加容易-且不那么脆弱。然后,您的自定义合并驱动程序可以像true命令那样运行无操作,并且.gitattributes可用于为那些您不想合并其更改的文件指定该合并驱动程序。 (类似的示例可以在http://www.mcclellandlegge.com/2017-03-20-customgitmergedriver/中找到-除非链接消失了)。借助构建工具,可以安排这些工具。[1]

当然,一旦您使用了这些技术,就不一定有任何理由将选择的配置与分支联系起来。您可以有一个“开发配置文件”和一个“产品配置文件”,并为每个构建(或每次运行)指定正确的文件。此时,最好不要将配置文件保留在源代码管理中。

-

[1]假设您有一个文件,其中包含要合并的更改和不想合并的更改。您可以将占位符放入您不想合并的更改中,然后将实际值输入一个env-config.txt文件中。因此,您的构建知道如何读取env-config.txt并将在其中找到的值替换为占位符,然后您根本就不会在分支之间完全合并env-config.txt