git-如何从合并中排除文件
我正试图在一个存储库中保存网站的两个项目。除了模板(html、css)文件和少数配置文件外,这些网站基本相同。 主站点(我说的超级站点)位于分支主站点中。第二个站点位于branch Secondary站点中。每次,当我在主分支中开发一些新功能时,我都想将其合并到secondarySite,但我想从合并中排除模板文件 我在这里找到了部分解决方案,但只有当我更改两个分支中的模板文件并且发生冲突时,它才起作用。当git没有冲突时,只需使用较新的远程版本的文件 我如何告诉git始终保持指定的本地文件不变,即使没有冲突 或者我对这个问题使用了完全错误的方法git-如何从合并中排除文件,git,merge,Git,Merge,我正试图在一个存储库中保存网站的两个项目。除了模板(html、css)文件和少数配置文件外,这些网站基本相同。 主站点(我说的超级站点)位于分支主站点中。第二个站点位于branch Secondary站点中。每次,当我在主分支中开发一些新功能时,我都想将其合并到secondarySite,但我想从合并中排除模板文件 我在这里找到了部分解决方案,但只有当我更改两个分支中的模板文件并且发生冲突时,它才起作用。当git没有冲突时,只需使用较新的远程版本的文件 我如何告诉git始终保持指定的本地文件不变
提前感谢您的帮助。您是否尝试过使用.gitignore?git文档中提供的详细信息如中所述,它们仅在发生冲突时有用。
那就是:看 一个非常有用的选项是告诉Git不要在特定文件有冲突时尝试合并它们,而是使用您的合并方而不是其他方的 这证实了这一点: 有没有办法从branchA合并到branchB,从branchB合并到branchB branchA同时完全忽略对跟踪文件的更改 并且存在于两个分支中 否。基本上,git中的提交对象由内容状态(即指向树对象的指针)和指向所有以前历史的指针(即零个或多个提交对象的“父”指针)组成。
提交对象的语义可以被认为是“我已经查看了所有父提交中的所有历史,并且我的树指针中包含的状态将取代它们” 因此,您可以将
B
合并到A
,但保留A
的文件副本(例如,使用“ours
”策略)。但也就是说,您考虑了A和B的状态,并决定A
的版本将取代B
中发生的情况。如果以后要从A
合并到B
,B
的文件版本甚至不会被视为合并的结果
通过不同的合并策略来解决这个问题并不是一个聪明的方法;这是git存储历史的数据结构的一个基本方面
如果这些模板位于子目录中,最好将它们隔离在自己的git repo中,以便将该repo作为子模块包含
如果没有,则需要在提交之前恢复错误合并的文件(如中所示):
这里git update index-将工作树中的文件内容注册到索引中
git update-index --assume-unchanged <PATH_OF_THE_FILE>
git更新索引--假定未更改
例如:-
git更新索引——假设somelocation/pom.xml未更改
或
在.gitignore中添加文件路径
或者我对这个问题使用了完全错误的方法
您对这个问题使用了完全错误的方法:)
问题在于,分支及其周围的工具旨在维护同一底层事物的不同版本
但你的两个网站其实并不是同一个东西,它们是两个不同的东西,有一些共同点,你不得不滥用git,因为你在他们的关系上对它撒谎
你的理智选择是:
让你的回购协议代表所有(好的,两个)网站。因此,它们都在相同的目录结构中可见,并且使用不同的路径名。它们可能有单独的dev和release分支,但这是可选的。如果这两个站点有一些共同点,那么可以采用共享文件的形式
例如
对每个站点进行单独的回购,并复制公共文件。您只需复制更改即可
对每个站点进行单独的回购,对普通内容进行第三次回购,并使用子模块将supersite+common在一个位置合并,secondsite+common在另一个位置合并
例如
注意,子模块引用相同的repo,但每个实例当前可以位于不同的分支或提交上
在某种程度上,正确的选择取决于两个站点独立变化的程度,共享比特的变化频率,强制两个站点使用相同版本的共享比特是否合适,以及在每个分支中共享与唯一的内容占总内容的比例等。,在根目录中添加文件.gittributes
对于每个分支,指定合并时要忽略的文件,如下所示:
filename merge=ours
不要忘记为此激活驱动程序:
git config --global merge.ours.driver true
尝试合并,您将看到在合并过程中,每个分支中.gittributes
中指定的文件将保持不变。谢谢您的建议。问题是,我需要跟踪两个分支中的文件-我只想保持这些文件“特定于分支”。您是否找到了解决方案?这是这个特定问题的正确答案,值得更多的投票<代码>“我试图将网站的两个项目保存在一个存储库中。”
分支不是用于保存不同但类似的项目,而是用于保存同一项目的不同版本。
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
filename merge=ours
git config --global merge.ours.driver true