资讯动态

git submodule

发布时间:2026/10/15 1:55:57 来源:尧图企业网站定制
文章目录1.简介2.格式3.选项4.示例5.小结参考文献1.简介git submodule 用于管理子模块。有种情况我们经常会遇到某个工作中的项目需要包含并使用另一个项目。也许是第三方库或者你独立开发的用于多个父项目的库。 现在问题来了你想要把它们当做两个独立的项目同时又想在一个项目中使用另一个。Git 通过子模块来解决这个问题。子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。它能让你将另一个仓库克隆到自己的项目中同时还保持提交的独立。2.格式gitsubmodule[--quiet][--cached]gitsubmodule[--quiet]add[options][--]repository[path]gitsubmodule[--quiet]status[--cached][--recursive][--][path…​]gitsubmodule[--quiet]init[--][path…​]gitsubmodule[--quiet]deinit[-f|--force](--all|[--]path…​)gitsubmodule[--quiet]update[options][--][path…​]gitsubmodule[--quiet]set-branch[options][--]pathgitsubmodule[--quiet]set-url[--]pathnewurlgitsubmodule[--quiet]summary[options][--][path…​]gitsubmodule[--quiet]foreach[--recursive]commandgitsubmodule[--quiet]sync[--recursive][--][path…​]gitsubmodule[--quiet]absorbgitdirs[--][path…​]3.选项-q,--quiet只打印错误信息 -b,--branchbranch要添加为子模块的仓库分支。分支的名称记录在 .gitmodules 文件中的 submodule.name.branch用于 update --remote。特殊值.用于指示子模块的分支名称应与当前仓库的当前分支名称相同。如果未指定该选项则默认为远程 HEAD。path…​ 子模块的路径。当指定时这将限制命令只操作指定路径上找到的子模块。(此参数对于add是必填的)。4.示例1查看子模块。gitsubmodule2添加子模块。gitsubmoduleaddrepository-urlpath该命令会将一个远程仓库添加为子模块并将其克隆到指定的目录。同时会在主仓库中生成一个 .gitmodules 文件来记录子模块的信息。3克隆包含子模块的仓库。如果第一次使用 git clone 下载主仓库建议使用如下命令把主仓库和子模块一次性下载下来。gitclone --recurse-submodulesproject-url如果使用 git clone 下载主仓库时没有使用--recurse-submodules你会发现子模块的文件夹是空的此时我们可以初始化子模块如果不指定子模块路径则初始化所有子模块。gitsubmodule init[path...]当你克隆一个包含子模块的仓库时子模块的相关信息如 URL 和路径会被保存在 .gitmodules 文件中。执行 git submodule init 后Git 会根据这个文件中的配置信息准备好子模块的本地配置。初始化完子模块后然后更新子模块则会根据子模块的配置信息拉取子模块的代码为主项目里指定的 commit id。gitsubmodule update[options][--][path...]或者直接初始化和更新子模块。gitsubmodule update--init这个命令会下载子模块的内容到指定的路径。其中--init用于初始化子模块。4拉取子模块的远端更新。如果子模块在远端发生了版本变更有多种方法可以获取子模块最新版本。方法一cd submodule 后 git pull。在 submodule 中所有 Git 操作就当作一个普通的 Git 仓库就行你可以切换分支、提交代码、拉取更新等。这个方法你可以拉取到 submodule 的最新代码。但是如果这时候的 commit id 跟主项目里记录的 submodule 的 commit id 不一致你会在主项目仓库看到 diff你可能需要提交主项目更新。方法二使用如下命令这相当于在每个子模块中执行 git pull。gitsubmodule update--remote[path...​]如果你不带参数子模块路径就会更新所有子模块。当我们更新子项目后相当于把主项目记录的 submodule 的 commit id 给更新了需要提交下主项目的变更。5推送子模块的变更到远端。如果在本地修改了子模块需要推送子模块到远端仓库。此时在主项目中使用 git status 能够看到关于子模块尚未暂存以备提交的变更但是于主项目而言是无能为力的使用 git add/commit 对其不会产生影响。在此情景下通常需要进入子模块文件夹按照子模块内部的版本控制提交代码。注意当在子模块做 commit 后此时主项目中所记录的子模块的 commit id 也会更新需要提交下主项目的变更。6删除子模块。gitsubmodule deinit[-f|--force](--all|[--]path…​)如果加上参数 -f|–force则子模块工作区内即使有本地的修改也会被移除。执行完上面的命令会自动在 .git/config 中删除子模块的配置信息。然后我们还需要使用 git rm 删除子模块目录。gitrmpath...5.小结虽然 Git 提供的子模块功能已足够方便好用但不建议使用。请在为主仓库项目添加子模块之前确保这是非常必要的。毕竟有很多编程语言提供了类似的依赖包管理工具如 Go Modules、Node.js npm 和 Ruby’s rubygemsor 等可以更好地完成类似的功能。主项目的合作者并不会自动地看到子模块仓库的更新通知所以更新子模块后一定要记得提醒一下主项目的合作者执行git submodule update --remote。参考文献git submodule

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑