我有一个包含5个子文件夹的git目录:
允许像往常一样合并文件夹1到4的内容。但是,每次都必须覆盖文件夹5中的所有内容,而不是合并。没有例外。有没有办法可以修改.gitattributes文件以自动执行此操作?
答案 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/file1
和Folder5/file2
,但branch
仅修改Folder5/file1
,那么合并结果将具有master
版file2
1}}和branch
版file1
。
此外,如果您有“长期”分支并执行“向后合并”以防止它们失去同步,则向后合并的(可能是静默的)默认值将覆盖分支中的更改来自master
的更改。
因此,根据您的工作流程,这可能会使git在默认情况下“做正确的事情”更频繁,但它也可能会创建一些意外和有害的事情。
如果您想保留主版本怎么办?
那么你可以稍微改变合并驱动程序
[merge "ours"]
name = Keep 'Our' Version
driver = true
(你真的只是对这个驱动程序进行无操作;在之前的版本中,我建议touch %A
为“相对无害”,但这样可以避免调整时间戳。)
当然,.gitattributes
条目会说merge=ours
同样,这仅在文件实际受合并影响时生效。因此,如果同一文件在branch
上发生了更改,则master
上的更改将被忽略。
在正面(我猜),在这种情况下,“向后合并”到长寿分支可能不那么麻烦。