我试图在一个存储库中保留2个网站项目。除了模板(html,css)文件和少量配置文件外,这些网站主要是相同的。
主站点(我说是Supersite)是分支机构的主人。第二个站点位于分支secondarySite中。每当我在master分支中开发一些新功能时,我想将它合并到secondarySite,但我想从合并中排除模板文件。
我找到了部分解决方案 我怎么告诉git总是选择我的本地版本来解决特定文件上的冲突合并? 但它只有在我更改两个分支中的模板文件时才有效 发生冲突。当没有冲突时,git只使用较新的远程版本的文件。
我怎么能告诉git 总是 即使没有冲突,也保持指定的本地文件不变。
或者我可能使用完全错误的方法解决问题?
在此先感谢您的帮助。
如提到的那样 我对合并驱动程序的回答,它们仅在发生冲突时才有用。
那 适用于a merge=ours
在一个 .gitattributes
文件:看 合并策略。
一个非常有用的选择是告诉Git不要尝试合并特定文件 当他们有冲突时,而是将合并的一方用于别人的合并。
这个 最近的帖子(2012) 证实了这一点:
有没有办法从branchA合并到branchB和从branchB合并到
branchA同时完全忽略对被跟踪文件的更改
并存在于两个分支?
不,从根本上说, git中的提交对象由内容状态组成 (即指向树对象的指针) 和指向所有以前历史的指针 (即,提交对象的零个或多个“父”指针)。
提交对象的语义可以被认为是“我查看了所有父提交中的所有历史记录,并且我的树指针中包含的状态全部取代它们”。
所以你可以合并 B
成 A
,但保持 A
该文件的副本(例如,使用“ours
“战略”。但这就是说你考虑了A和B的状态,并决定了 A
的版本取代了发生的事情 B
。如果你以后想要合并 A
至 B
, B
该文件的版本甚至不会被视为合并的结果。
通过不同的合并策略,没有一种聪明的方法可以解决这个问题;它是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
你尝试过使用.gitignore吗? git文档中提供了详细信息 这里
这里git-update-index - 将工作树中的文件内容注册到索引。
git update-index --assume-unchanged <PATH_OF_THE_FILE>
例:-
git update-index --assume-unchanged somelocation/pom.xml
要么
在.gitignore中添加文件路径
或者我可能使用完全错误的方法解决问题?
你使用完全错误的方法解决这个问题:)
问题在于分支及其周围的工具旨在维护相同底层的不同版本 事情。
但是你的两个网站并不是真正相同的基础,它们是两个不同的东西,有一些共性,你不得不滥用git,因为你对它们的关系撒谎。
你理智的选择是:
让你的回购代表 所有的宇宙 (好的,两个) 网站。因此,它们在同一目录结构中都可见,并使用不同的路径名。他们 威力 有单独的开发和发布分支,但它是可选的。如果这两个站点具有一些共性,则可以采用共享文件的形式。
例如。
repo/supersite
repo/secondsite
repo/common
为每个站点创建一个单独的repo,并复制公共文件。您只需复制更改即可
为每个站点创建一个单独的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,但每个实例当前可以在不同的分支或提交上
在某种程度上,正确的选择取决于两个站点独立变化的程度,以及共享位变化的频率,以及是否可以强制两个站点使用相同版本的共享位,以及总内容的多少部分是共享与独特等等。
在每个分支中,添加文件 .gitattributes
在根。
对于每个分支,指定在合并时要忽略的文件,如下所示:
filename merge=ours
并且别忘了激活驱动程序:
git config --global merge.ours.driver true
尝试合并,你会看到指定的文件 .gitattributes
合并发生时,每个分支都不会受到影响。