始终覆盖特定子文件夹的内容

时间:2017-06-15 18:40:05

标签: git

我有一个包含5个子文件夹的git目录:

  • 我的项目
    • 文件夹1
    • 文件夹2
    • 文件夹3
    • 文件夹4
    • 文件夹5

允许像往常一样合并文件夹1到4的内容。但是,每次都必须覆盖文件夹5中的所有内容,而不是合并。没有例外。有没有办法可以修改.gitattributes文件以自动执行此操作?

1 个答案:

答案 0 :(得分:0)

更新 - 我应该添加一些想法...

“合并驱动程序”方法的另一个缺点是,我很确定你必须(部分地)在repo的每个克隆中单独设置它,因为我不认为必要的配置设置将由push / fetch操作共享。您可以通过使用默认的binary合并驱动程序来避免这个问题(尽管在这种情况下,git只会告诉您文件级合并时会发生冲突,而不是“尝试做正确的事情”在该目录中需要;并且这仍然是逐个文件的解决方案。)

这也指出这是一个客户强制执行的计划;如果你需要一个硬策略,服务器端的post-receive hook可能更合适。 (实际上两者的组合可能值得考虑,以避免意外违规行为长时间无法修复。)但问题是,定义钩子以区分“坏”推动与“良好”推动案件可能不那么简单。

原始回复

我能想到的最好的方法是定义自定义合并驱动程序并使用.gitattributes。但这并不好 - 可能会出现一些行为不符合您预期的情况。

假设你有

R --- A <--(master)
 \
  B <--(branch)

A以及B各自修改子目录中的文件。所以将branch合并到master中,如果要保留B的版本(从分支覆盖),您将执行以下操作。 (我将重新审视这些步骤,以及您将如何保留master版本......)

在存储库配置中,定义自定义合并类型

[merge "theirs"]
        name = Keep 'Their' Version
        driver = cp %B %A

然后在工作树根目录中创建一个.gitattributes文件,您将添加并提交

Folder5/* merge=theirs

(或者,如果有子目录也需要这种处理,

Folder5/**/* merge=theirs

代替。)

现在,只要您合并包含Folder5中文件更改的分支,就会进行以下更改; “我们的”分支中相同文件的任何更改(冲突或其他)(例如,将“master合并到branch”的master方面将被忽略。

,如果branch中的特定文件未更改,则会master中的所有更改。这是在逐个文件的基础上确定的;因此,如果master修改Folder5/file1Folder5/file2,但branch仅修改Folder5/file1,那么合并结果将具有masterfile2 1}}和branchfile1

此外,如果您有“长期”分支并执行“向后合并”以防止它们失去同步,则向后合并的(可能是静默的)默认值将覆盖分支中的更改来自master的更改。

因此,根据您的工作流程,这可能会使git在默认情况下“做正确的事情”更频繁,但它也可能会创建一些意外和有害的事情。

如果您想保留主版本怎么办?

那么你可以稍微改变合并驱动程序

[merge "ours"]
        name = Keep 'Our' Version
        driver = true

(你真的只是对这个驱动程序进行无操作;在之前的版本中,我建议touch %A为“相对无害”,但这样可以避免调整时间戳。)

当然,.gitattributes条目会说merge=ours

同样,这仅在文件实际受合并影响时生效。因此,如果同一文件在branch 上发生了更改,则master上的更改将被忽略

在正面(我猜),在这种情况下,“向后合并”到长寿分支可能不那么麻烦。