2017-06-15 72 views
0

我有一个包含5个子文件夹的git的目录特定子文件夹的内容:始终覆盖

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

允许像往常一样合并文件夹1至4的内容。但是,每次都必须覆盖文件夹5中的所有内容,而不是合并。没有例外。有没有一种方法可以修改.gitattributes文件以使其自动发生?

+0

为什么它总是被覆盖? – axiac

+0

里面的文件是专有的,如果与其他版本的文件合并,将无法在其本机软件中正常工作。 –

回答

0

UPDATE - 一对夫妇的想法,我要补充...

另一个下侧的“合并驱动程序”的做法是,我敢肯定你得(部分),将其设置因为我不认为必要的配置设置将被push/fetch操作共享。你可以通过使用默认的binary合并驱动程序来避免这个问题(尽管在这种情况下,不是“试图做正确的事情”,git会告诉你任何时候在该目录中需要文件级合并都会产生冲突;这仍然是一个逐个文件的解决方案)。

而且这也指出这是一个客户执行的计划;如果你需要一个硬策略,服务器端的post-receive hook可能更合适。 (实际上,两者的结合可能值得考虑,以避免意外的违规行为发生时间过长而难以修复)。但问题在于,定义了一个钩子来区分这个“坏”推子和这个“好”推子情况可能并不那么简单。


原始响应

我能想到的是定义一个定制的合并驱动器和使用.gitattributes最好的。但这并不是很好 - 可能会出现一些情况,其行为不符合您的预期。

假设你有

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

AB每修改一个文件的子目录。所以合并branchmaster,如果你想保留从B(从分支覆盖)的版本,你会做到以下几点。 (我会重新访问这些步骤,你将如何保持master的版本......)

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

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

然后创建一个.gitattributes文件在你的工作树根,你会添加并提交

Folder5/* merge=theirs 

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

Folder5/**/* merge=theirs 

改为。)

现在,当您合并包含Folder5中文件更改的分支时,将进行这些更改; “我们的”分支中的相同文件(例如“合并branchmaster”中的master侧)的任何改变(冲突或其他)将被忽略。

无论其,如果一个特定的文件是不变branch,然后在master任何更改都将采取。这是在逐个文件的基础上确定的;因此,如果master修改Folder5/file1Folder5/file2,但branch仅修改Folder5/file1,然后合并结果将有masterfile2branch版本的file1。另外,如果你有过“长寿命”的分支,并且做了“向后合并”以防止它们不同步,向后合并的(可能是无声的)默认值将覆盖分支中的更改与master的变化。

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

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

那么,你可以定义合并司机有点不同

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

(你真的只是在做无操作与此驱动程序;在以前的版本我建议touch %A为“相对无害”,但这避免甚至调整的时间戳。)

,当然还有.gitattributes进入会说merge=ours

同样,这才会生效,当一个文件实际上是受合并影响。所以这意味着branch上的更改将被忽略如果相同的文件在master上有更改。

另一方面(我猜),在这种情况下,“向后合并”长寿命分支可能不太麻烦。

+0

仅供参考,您可以使用'true'作为无操作驱动程序 - 无需更新日期戳。然而,只有在“双方”有变化的情况下,司机才会运行的事实是(我认为)这里的主要问题。 – torek

+0

嗯。那么,你说'真的'是对的。我不确定它是否很重要(因为通常您不希望合并保留时间戳),但我会相应地更新。正如我所指出的那样,“非合并”案件无疑给了我这种方法最多的停顿;但我认为我可能会提供它,以防OP对他的用例感觉比什么都好,特别是因为我根本不知道更好的方法来近似所请求的内容 –