git clone --recursive慢_Git 高级用法 — Submodule
Hi 小伙伴们,好久不见,狗哥今天要来聊一聊代码版本管理Git工具中的少有人知的功能:git submodulePart 00使用场景在项目开发的时候经常遇到某个工作中的项目需要包含并使用另一个项目,有可能是第三方库,或者是小伙伴们独立开发的库,或者是被用于多个父项目的共用库。那么现在问题来了:我们想要把它们当做两个独立的项目分别维护,同时又想在一个项目中使用。该如何操作呢?...

Hi 小伙伴们,好久不见,狗哥今天要来聊一聊代码版本管理 Git 工具中的少有人知的功能:git submodule
Part 00 使用场景
在项目开发的时候经常遇到某个工作中的项目需要包含并使用另一个项目,有可能是第三方库,或者是小伙伴们独立开发的库,或者是被用于多个父项目的共用库。
那么现在 问题 来了:
我们想要把它们当做两个独立的项目分别维护,同时又想在一个项目中使用。该如何操作呢?
不要告诉我 一个一个复制到项目中去就可以,如果某小伙伴的项目中包括了10个其他的项目作为本项目的子项目,若它们的版本都有更新,那小伙伴会不会需要将最新的代码 Copy 10 遍到本项目中呢 ?
如果数量再多一些,有100个,1000 个项目需要更新 ?
估计小伙伴 Ctrl+C and Ctrl+V 已手指抽筋,哭晕在厕所中了……
推荐小伙伴们一个 NB 且 优雅 的解决方案:
可利用 Git 子模块 ( git submodule ) 来解决这个问题。
-
子模块允许将一个 Git 仓库作为另一个 Git 仓库的子目录,同时还保持两个仓库提交的独立管理;
-
子模块的代码版本被父项目记录并进行版本管理;
-
可批量更新、管理子模块;
Part 01 Submodule 使用方法
0x01 添加子模块
首先在项目中创建用于存放其他项目的目录,并进入该目录添加子模块:
# 命令模板 git submodule add # repo_url 是项目 git 地址# path 是目标地址,默认为空,表示当前目录
当加入子模块后,主项目的根目录中会出现 .gitmodules 文件
.gitmodules 文件中的内容如下:
[submodule ""] path = url =
详细解释:
-
repo_name:项目git版本库所设置的名称;
-
path:相对父项目根目录的相对路径;
-
url:项目git的地址链接;
0x02 更新子模块
# 初始化子模块git submodule init# 更新子模块git submodule update# 也可以在父项目克隆到本地的时候 同时载入包含的子模块git clone --recurse-submodules # 如果没有在 父项目 中载入子模块,还可以使用 命令递归载入子模块git submodule update --init --recursive
注意:
-
子模块的 git 操作与正常项目的 git 操作没有区别;
-
默认git submodule update并不会将submodule切到任何branch,所以默认情况下 submodule 的 HEAD 是处于游离状态的(‘detached HEAD’ state)。
在修改代码前,需要进入子模块并用 git checkout master 将当前的 submodule 分支切换到 master,然后再做 修改 和 提交 。 -
子模块的版本会记录在父项目中,因此如果修改了子模块,请先提交子模块的修改内容,之后再提交父项目的修改内容,这样就可以把修改后的子模块版本记录到父项目中;
0x03 变更子模块的 repo_url
若子模块的 repo_url 发生了变化,首先需要更改 .gitmodules 文件中的 repo_url 地址,然后运行如下命令进行更新:
# 将新的 URL 复制到本地配置中git submodule sync --recursive# 然后更新git submodule update --init --recursive
官方文档:
-
https://git-scm.com/book/en/v2/Git-Tools-Submodules
-
https://git-scm.com/book/zh/v2/Git-工具-子模块
Git submodule 子模块的分享到这里就结束了,如果小伙本们有好的建议或者有想了解的技术知识,欢迎来到狗哥的公众号 【狗哥不苟】 下留言~


---- / END / ----
狗哥不苟 就是这样分享干货
未经授权禁止转载
若有问题欢迎反馈
更多推荐



所有评论(0)