问题 git - 如何从合并中排除文件


我试图在一个存储库中保留2个网站项目。除了模板(html,css)文件和少量配置文件外,这些网站主要是相同的。 主站点(我说是Supersite)是分支机构的主人。第二个站点位于分支secondarySite中。每当我在master分支中开发一些新功能时,我想将它合并到secondarySite,但我想从合并中排除模板文件。

我找到了部分解决方案 我怎么告诉git总是选择我的本地版本来解决特定文件上的冲突合并? 但它只有在我更改两个分支中的模板文件时才有效 发生冲突。当没有冲突时,git只使用较新的远程版本的文件。

我怎么能告诉git 总是 即使没有冲突,也保持指定的本地文件不变。

或者我可能使用完全错误的方法解决问题?

在此先感谢您的帮助。


3571
2018-06-09 14:22


起源

你有没有找到解决方案? - pvinis


答案:


如提到的那样 我对合并驱动程序的回答,它们仅在发生冲突时才有用。
适用于a merge=ours 在一个 .gitattributes 文件:看 合并策略

一个非常有用的选择是告诉Git不要尝试合并特定文件 当他们有冲突时,而是将合并的一方用于别人的合并。

这个 最近的帖子(2012) 证实了这一点:

有没有办法从branchA合并到branchB和从branchB合并到     branchA同时完全忽略对被跟踪文件的更改     并存在于两个分支?

不,从根本上说, git中的提交对象由内容状态组成 (即指向树对象的指针) 和指向所有以前历史的指针 (即,提交对象的零个或多个“父”指针)。
  提交对象的语义可以被认为是“我查看了所有父提交中的所有历史记录,并且我的树指针中包含的状态全部取代它们”。

所以你可以合并 B 成 A,但保持 A该文件的副本(例如,使用“ours“战略”。但这就是说你考虑了A和B的状态,并决定了 A的版本取代了发生的事情 B。如果你以后想要合并 A 至 BB该文件的版本甚至不会被视为合并的结果。

通过不同的合并策略,没有一种聪明的方法可以解决这个问题;它是git存储历史数据结构的一个基本方面。

如果这些模板位于子目录中,最好将它们隔离在自己的git仓库中,以便将该repo包含为子模块。

如果没有,那么你需要在提交之前恢复错误合并的文件(如 这个帖子):

git merge --no-commit other
git checkout HEAD XYZ  # or 'git rm XYZ' if XYZ does not exist on master
git commit 

6
2017-11-22 11:26





你尝试过使用.gitignore吗? git文档中提供了详细信息 这里


3
2018-06-09 15:03



谢谢你的建议。问题是我需要跟踪两个分支中的文件 - 我只想保持这些文件“特定于分支”。 - Marcin


这里git-update-index - 将工作树中的文件内容注册到索引。

git update-index --assume-unchanged <PATH_OF_THE_FILE>

例:-

git update-index --assume-unchanged somelocation/pom.xml

要么

在.gitignore中添加文件路径


2
2017-09-28 17:01





或者我可能使用完全错误的方法解决问题?

你使用完全错误的方法解决这个问题:)

问题在于分支及其周围的工具旨在维护相同底层的不同版本 事情

但是你的两个网站并不是真正相同的基础,它们是两个不同的东西,有一些共性,你不得不滥用git,因为你对它们的关系撒谎。

你理智的选择是:

  1. 让你的回购代表 所有的宇宙 (好的,两个) 网站。因此,它们在同一目录结构中都可见,并使用不同的路径名。他们 威力 有单独的开发和发布分支,但它是可选的。如果这两个站点具有一些共性,则可以采用共享文件的形式。

    例如。

    repo/supersite
    repo/secondsite
    repo/common
    
  2. 为每个站点创建一个单独的repo,并复制公共文件。您只需复制更改即可

  3. 为每个站点创建一个单独的repo,为常见的东西创建第三个repo,并使用子模块在一个地方组合supersite + common,在另一个地方组合secondsite + common。

    例如。

    super-repo/site    # super site content
    super-repo/common  # common repo as submodule
    second-repo/site   # second site content
    second-repo/common # same common repo as submodule
    

    请注意,子模块引用相同的repo,但每个实例当前可以在不同的分支或提交上

在某种程度上,正确的选择取决于两个站点独立变化的程度,以及共享位变化的频率,以及是否可以强制两个站点使用相同版本的共享位,以及总内容的多少部分是共享与独特等等。


1
2017-09-28 17:21





在每个分支中,添加文件 .gitattributes 在根。

对于每个分支,指定在合并时要忽略的文件,如下所示:

filename merge=ours

并且别忘了激活驱动程序:

git config --global merge.ours.driver true

尝试合并,你会看到指定的文件 .gitattributes 合并发生时,每个分支都不会受到影响。


1
2017-10-02 13:57