在管理前端项目时,我们都会遇到这样的场景(项目使用git进行管理):
项目的业务代码和公共组件代码耦合度过高,当有新的项目时,我们通常会把公共组件从上一个项目进行拷贝,或者直接fork上一个项目作为新项目的仓库。
当发现公共组件出现问题,并做修改后,我们还要将组件在两个项目之间来回拷贝。
这就会出现一些问题,比如,来回拷贝比较耗时,而且不易管理,当再有其他项目时就会出现滚雪球的效应,因为公共的组件不只一个,一个组件变动了,为了同步最新的代码,往往每个项目都要改正一遍。
再者,如果公共代码没有规范的进行管理,每个项目组成员都可以改,那么会出现公共代码改错了的情况。
为了更好的管理前端项目,所以我整理了实现思路和落地方案供大家参考。
解决方式就是要把公共的代码抽取出来,并重构公共代码组件,提供业务需要时必须的组件参数,尽量做到组件和业务代码解耦。
具体做法就是为公共代码创建一个独立的仓库,在项目使用时通过拉取子仓库,并嵌入到项目中作为一个文件目录使用。
这样做的一个核心思想就是能够将远程仓库的代码拉取到项目中,并让开发人员像使用本地代码那样来使用远程仓库,能够做到本地代码调试。正好在git中提供这样的功能 即:git subtree 和 git sumodule
使用git subtree
git subtree是一个用于管理多个项目仓库的工具。它可以将一个仓库作为一个子目录添加到另一个仓库中,这个子目录作为一个普通的文件目录嵌入到主仓库中,而不需要使用子模块或子树合并。
简单来说,就是把子仓库复制了一份嵌入到主仓库中使用。这样,就可以在多个项目中共享和同步一些公共的文件或组件,而不需要使用子模块或者复制粘贴的方式。
A项目中添加子树
现假如我有公共仓库的地址为:https://192.168.0.101/app/app-common.git 简称 common 仓库,也是作为子仓库供各个项目使用。
现有2个项目 A、B项目要common仓库进行引入,基本语法如下:
首先给各个项目添加远程子仓库的地址,需要先使用git remote add
命令来添加一个远程仓库,作为子树的来源。
git remote add common https://192.168.0.101/app/app-common.git
这样,就可以把这个仓库命名为common,以便后续的操作。可以使用任意的名字来代替common,只要不和其他远程仓库的名字冲突即可。
接着,需要使用git subtree add
命令来把这个远程仓库(common仓库)的指定分支的内容添加到你的当前仓库的指定目录下(当前仓库指的就是A项目或B项目),作为一个子树。
例如,如果想要把common子仓库的master分支的内容添加到A项目的components目录下,可以执行以下命令:
# 进入到A项目路径
cd 【A或B项目的根路径】
# 添加子树到项目中
git subtree add --prefix=【将子仓库存放到A或B项目中的相对路径】 【common项目git地址】 【common项目的分支】
# 使用案例
git subtree add --prefix=src/components common master
这样,就可以在A项目仓库中的src/components目录下引入这个远程仓库的master分支的内容,作为一个子树。可以根据具体需要,修改–prefix和分支名参数。
需要注意的是:上述命令需要做的前提是要保证A项目没有变更,就是本地的修改没有提交。否则会出现添加子树报错的情况,所以,要把未提交的数据回滚或提交上去才能使用上述命令。
A项目中修改子仓库并提交
如果我们想在A项目中修改子仓库的内容也没问题,修改后直接就可以在当前项目中把子仓库修改的内容提交到子仓库中,需要使用如下命令
git subtree push --prefix=src/components common master
上面的命令是将子仓库修改的内容提交到子仓库的master分支下,当然,这个master分支 可以变更名称,比如下面:
git subtree push --prefix=src/components common master-1
这个命令是在子仓库common中重新生成一个master-1分支,包含了你过去对src/components 所有的更改记录。
提交到子仓库的master-1分支依然可以合并到master分支上。但是为了安全,一般来说都是由项目管理员去子仓库上直接修改,尽量不要在项目中直接修改子仓库。因为我们刚刚说了,子仓库common就是一个公共的仓库,不允许随便修改的,而git subtree 正式适合这种不会频繁修改子仓库的场景中。
为了提升push 效率,我们也可在push之前 执行如下命令,目的是重新split出一个新起点,每次提交子树的时候就不会从头遍历一遍了。
git subtree split --prefix=src/components --rejoin
git subtree push --prefix=src/components common master-1
git subtree split --rejoin --prefix=src/components--branch master-1
git push common master-1:master
git subtree split --rejoin --prefix=src/components--branch master-1
:这个命令会把当前仓库的src/components目录的内容分离出来,作为一个新的分支master-1。这个分支只包含src/components目录的历史记录,而不包含当前仓库的其他内容。–rejoin参数的作用是让您的当前仓库的HEAD指向这个新的分支,以便后续的操作。git push common master-1:master
:这个命令会把当前仓库的master-1分支的内容推送到另一个远程仓库的master分支。这个远程仓库的名字是common。A项目拉取子仓库最新内容
git subtree pull --prefix=src/components common master
A 项目 删除子仓库的内容
git rm -r src/app-common
GIT SUBTREE的使用总结
git merge
命令将子仓库的分支合并到父仓库的子目录中,使用git filter-branch
命令将子目录的修改过滤出来,推送到子仓库的分支上。使用 git submodule
git submodule
命令,这里我们简单提一提就可以了,使用方式比较简单。git submodule
的概念是:将一个仓库作为一个子模块添加到另一个仓库中,作为一个特殊的文件类型,只记录子仓库的提交哈希值。git clone
命令将子仓库的地址添加到父仓库的.git/modules目录中,使用git update-index命令将子仓库的提交哈希值添加到父仓库的索引中,作为一个特殊的文件类型。# (git submodule add 子仓库地址 主仓库建立submodule路径)
git submodule add http://192.168.5.153/app/common src/app-common
git submodule update --init
git checkout 、pull、push
。当子仓库有代码变动时,也同样需要单独进入子仓库路径进行pull 拉取操作。Git subtree 和 git submodule
Git-repo 命令
python -m pip install --user git-filter-repo
C:UserssenduAppDataRoamingPythonPython310Scripts
),要把这个路径添加到中,也就是添加到环境变量中。它可以安装在 git --exec-path
指向的目录中,或放置在 $PATH 中的任何位置。git --exec-path
git filter-repo
命令了。master-c-temp
git filter-repo --path 4 --invert-paths
initAndUpdateApp
这个组件,那么我需要执行如下命令:git filter-repo --path initAndUpdateApp --invert-paths
git filter-repo --path map --invert-paths --force
initAndUpdateApp
之外的3个组件。# 给仓库添加新分支
git remote add master-c http://192.168.0.101/app/common.git
#提交
git push master-c --all
-
在你的本地仓库中,运行 git filter-repo
命令,指定你想要过滤的路径、分支、标签等参数。 -
运行 git remote add <new-origin> <new-repo-url>
命令,添加一个新的远程仓库,其中<new-origin>
是你给新仓库起的名字,<new-repo-url>
是新仓库的地址。 -
运行 git push <new-origin> --all
命令,将你的所有分支推送到新的远程仓库。
总结
git filter-repo
命令的使用。因为我们主要讨论方案,具体使用还需要大量的实战,本文列出的实战方案基本解决了多个项目共享同一个仓库的需求。如果大家有更好的方式,可以发消息讨论哦~往期文章推荐
原文始发于微信公众号(小核桃编程):一文搞懂git仓库共用的秘诀,让您优雅的管理项目。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/216060.html