背景
近来工作中碰到了一个题目:随着项目越来越多,许多项目依靠一致个模板或是配置文件想一致治理,又不想离开保护,所以只能相互援用,或是各自保护,致使了后续的许多贫苦。
场景一: 许多公司手机端和pc同时开辟,援用一致套模板,或许通用的组件库。
场景二: 用gulp、webpack来打包,或是用node来开辟会有一些通用的配置文件须要一致治理。
第一阶段:gulp等自动化东西手动同步
这个是我们最初运用的要领,比方有两个项目projectA和projectB,B项目依靠A项目中的一套模板,会碰到几个题目:
开辟中我们援用模块的时刻,B项目要经由很长的途径援用才引到A项目中的模板,这请求一切开辟者当地文件途径保持高度一致。
运用webpack打包紧缩静态文件的时刻,A、B两个项目必需在一致个git分支,很轻易搅散。
修正完文件不能实时看到结果,还要手动同步一次。这点是开辟中最致命的题目,做前端的都邑有体味假如改了一个款式或是一个模板要经由过程一个很长的操纵途径才看到结果,是异常影响开辟效力的。
在用了几个月以后,种种题目暴露出来,我们必需找新的方法。
第二阶段:运用Git subtree
网上调研了许多要领,比方git submodule,第二阶段终究挑选了subtree,一是官网已不再引荐运用submodule了,二是subtree实在是太轻易易用了。(厥后和同事商量了下发明submodule照样有运用价值的,在第三阶段中我们再剖析。)
说到subtree易用,只须要2步就能够初始化好一个子项目:
第一步:增加长途堆栈
语法:git remote add -f <子堆栈名> <子堆栈地点>
实例:git remote add -f component git@xxx.git
考证:git remote -v
能够看到已你增加胜利了一个新的长途堆栈叫 component
第二步:建立当地目次
语法:git subtree add --prefix=<子目次名> <子堆栈名> <分支> --squash
实例:git subtree add --prefix=component component master --squash
这时刻会在当地新建一个叫component的文件夹,--squash
会把subtree上的修改合并成一次commit
第三步:运用 ( pull & push )
pull:git subtree pull --prefix=component component master --squash
push:git subtree push --prefix=component component master --squash
注重:必需在component的父级目次实行,运用起来还不是很轻易。
第四步:更轻易的运用
能够在package.json内里加script语句来实行,如许在每一个文件夹下都能够pull & push,强迫一致,防止失足。
第三阶段:运用Git submodule
假如是援用多个子项目,会形成当前项目过于痴肥。实在有的时刻相似组件库是不须要上线的,只在开辟环境援用就好了。
增加:
git submodule add
增加后会在当前目次下天生一个.gitmodules的新文件,内里会纪录submodule的援用信息,在当前项目标位置以及堆栈的url。
git submodule foreach git pull
如许能够更新一切子模块。
这里只引见了最基本的submodule用法,现实在多个项目中更新和修正submodule照样许多坑的,能够参考这篇文章 Git Submodule的坑。 所以我们规定在项目中只能pull子模块,修正的话只能到子模块中去push。 如许防止了多人修正形成的争执。
结论
在新员工到场团队时:一次性clone项目,submodule能够一同clone出来,只需增加–recursive递归参数就能够了,而subtree并不可,只能手动增加,不过能够借助神器Yeoman(一个自动天生项目脚手架的东西)来完成。
subtree合适像配置文件这类须要随着项目走的状况。
submodule合适在开辟阶段时援用,到了临盆环境会被打包到指定文件内,而自身并不必随着版本走的状况。