当前位置: 首页 > 科技观察

大型项目中如何使用Git子模块开发,看完升姿!

时间:2023-03-14 14:47:35 科技观察

上面写到公司需要开发一个内部系统,要求每个部门都可以访问。老板亲手挑选的,工期短,就把浩浩荡荡的几百人调过来了。再简单的事情,只要人多了,就会变得复杂,发展的世界也是如此。痛点在用Git协作一个上百人的大项目时,想一想我们的痛点:项目太大,大家等很久clone,不pull代码,你会发现即有数百个更新等待拉取一个人提交错误,数百人待命(笔者的真实经历)。代码回溯难度大,查找具体修改记录无异于大海捞针。这时候,Git子模块就派上用场了。首先需要的当然是合理的架构。由于公司的保密原则,这里就不贴出项目了。本文主要介绍子模块在协作中的使用。项目结构项目主要结构大致是这样的:└──src├──layout//公共布局目录├──public//公共页面目录├──router//路由入口├──components//commoncomponents├──modules//模块项目开发目录(子模块)|├──tms//子模块必须|│├──components//模块常用组件|│├──pages//模块页面|│├──router//模块路由|│└──store//模块vuex数据|└──...//每个子模块├──app.vue//下面的组件└──main.js//项目入口,一个部门和一个子模块,每个子模块必须包含master(生产),dev(开发)分支(推荐gitflow工作流程)。开发流程克隆项目和所有webpack项目一样,src只是业务代码,开发配置放在src之外,所以需要先克隆主项目,启动开发环境。$gitclonehttps://github.com/test/main.git添加子模块当然我们一般不会使用master分支进行开发。正确的姿势是clone项目后立即切换到dev-based开发分支(原则上业务组不需要关注主分支,对于项目的开发,架构组负责主项目,但为了保证最新的代码和添加合并子模块到dev分支,切换到主分支dev)。$gitcheckout-bdevorigin/dev这时候如果你的项目中已经有了子模块,你会发现modules文件夹下已经有了子模块,但是很明显这些模块现在是空目录(预期的结果,我们不需要按照其他模块)。同时在项目根目录下有一个.gitmodules文件,内容如下:[submodule"modules/suba"]path=modules/subaurl=https://github.com/test/suba.git这里是你的子模块关联文件,每次添加子模块都会添加一条新记录。如果是第一次添加Git子模块,会自动生成。有了开发环境,现在你需要关联你的子模块:$gitsubmoduleaddhttps://github.com/test/subb.gitmodules/subb第一次添加的子模块会拉取整个项目,打开muodules/subb文件夹,然后整个子模块的项目都原封不动地列在那里,并且在.gitmodules中添加了一个新的子模块记录modules/subb。编辑子模块同样,我们不应该对子模块的master分支进行任何编辑。这时候我们需要将子模块切换到基于dev的开发分支。进入子模块目录:$cdmodules/subb/$gitcheckout-bfeature/some-changeorigin/dev在你对子模块做了一些修改后,你想把这些修改推送到远程。$gitcommit-am'testcommitsubmodule'$gitcheckoutdev$gitmergefeature/some-change$gitpushorigindev$gitbranch-dfeature/some-change这时候你的子模块修改已经提交到远程了,但是如果你进入main的根目录project查看差异,你会发现主项目中有更多变化:$cd../../$gitdiff>diff--gita/subbb/subbindex433859c..b78179a160000---a/subb+++b/subb@@-1+1@@-Subprojectcommit433859c90e539d2a1b9fda27b32bef0d0acae9e6+Subprojectcommitb78179adab252a524ff2a41d6407a7daa6dad34f这是因为你修改了子模块subb并提交了,但是主工程的指针还是指向旧的committid,如果你不提交project使用gitsubmoduleupdate更新子模块仍然会在你修改之前拉取代码。关于:Git提交规范那么这个时候你需要提交主工程:$gitcommit-am"testcommitsubmodule"$gitpushorigindev这样,你所有的修改都已经提交了。新成员加入当新成员加入你的子模块需要拉取代码时:$gitclonehttps://github.com/test/main.git$gitcheckout-bdevorigin/dev$gitsubmoduleinit$gitsubmoduleupdatesubbgitsubmoduleupdate[submodulename]是指定拉取指定子模块的用法。如果需要更新所有的子模块,只需要使用gitsubmoduleupdate。一般我们在协作中只专注于自己的模块。然后新成员可以继续我们上面的开发过程。当然,在删除子模块时,有需求变更或添加错误。这时候需要删除子模块。值得吐槽的是git没有直接删除子模块的命令,只能逐步删除相关文件:版本控制中删除子模块:$gitrm-rmodules/subb在编辑器中删除如下相关内容,或者使用命令vi.gitmodules在vim中删除:[submodule"modules/subb"]path=modules/subburl=https://github.com/test/subb.gitbranch=dev在编辑器中删除如下相关内容,或者使用命令vi.git/config在vim中删除:[submodule"modules/subb"]url=https://github.com/test/subb.gitactive=true删除.git下的缓存模块:$rm-rf.git/modules/subb接下来提交修改:$gitcommit-am"deletesubb"$gitpushorigindev发布项目当整个开发过程结束,终于要发布了当然,你需要更新主项目中的所有子模块:$gitcheckoutmaster$gitpulloriginmaster$gitsubmoduleupdate$yarnbuild这时候你就可以release你的整个项目了。协同使用子模块的操作写在这里。如有任何疑问,欢迎在评论区留言。