场景
想要在一个工程中使用另一个工程的库(工程库在不断更新,包含独立的提交记录)。
通过 submodule 可以实现在一个工程中引入另一个工程,同时保留二者的提交记录并区分开来。
目前 submodule 能够实现单独开发子工程,不会影响父工程。父工程可以在需要的时候更新子模块的版本,从而实现完全的分离,两者提交独立。将一个工程拆分成多个仓库并进行集中管理,实现更细粒度的访问。
这解决了仓库过于庞大时所出现的传输量大、提交记录冗杂、权限分配等问题。
git help submodule #查看本模块的帮助
git submodule [--quiet] [--cached]
git submodule [--quiet] add [<options>] [--] <repository> [<path>]
git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…]
git submodule [--quiet] init [--] [<path>…]
git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…)
git submodule [--quiet] update [<options>] [--] [<path>…]
git submodule [--quiet] set-branch [<options>] [--] <path>
git submodule [--quiet] set-url [--] <path> <newurl>
git submodule [--quiet] summary [<options>] [--] [<path>…]
git submodule [--quiet] foreach [--recursive] <command>
git submodule [--quiet] sync [--recursive] [--] [<path>…]
git submodule [--quiet] absorbgitdirs [--] [<path>…]
一、添加子模块
# git submodule add <url> <path>
git submodule add https://github.com/yyy/xxx.git
推送添加的子模块
git push origin master
二、克隆含有子模块项目
git clone https://github.com/chaconinc/MainProject
# 用来初始化本地配置文件
git submodule init
# 该项目中抓取所有数据并检出父项目中列出的合适的提交
git submodule update
# 直接clone 包含全部
git clone --recurse-submodules https://github.com/chaconinc/MainProject
三、查看子模块
git submodule
Github 显示形式
如果将父项目推送到远程仓库(如 Github),在网页浏览该项目时子模块所在的目录会多一个类似 @70c316e
的后缀,即上面查看子模块命令输出内容的 hash 值的前面部分,点击这个目录会跳转到这个子模块对应的仓库地址(另一个 url)。
四 、移动子模块
要移动 Git 子模块,你需要执行以下步骤:
1.修改 .gitmodules
文件
打开 .gitmodules
文件,它位于你的 Git 项目根目录下,其中包含了子模块的配置信息。在这个文件中,你会看到类似以下的条目:
[submodule "submodule_name"]
path = path_to_submodule
url = URL_of_submodule_repository
2.移动子模块文件夹
现在,你可以手动移动子模块的文件夹到新的位置。
3.更新 .git/config
在你移动子模块文件夹后,需要更新 .git/config
文件中子模块的路径。找到对应的子模块条目,修改 url
后面的路径为新的子模块路径。
4.更新 Git 索引
使用以下命令更新 Git 索引以反映子模块的移动:
git submodule sync
5.更新父项目
进入到父项目根目录下,并执行以下命令来更新父项目,让其记录子模块路径的变化:
git add .
git commit -m "Updated submodule path"
这样就完成了子模块的移动操作。确保在进行这些步骤之前备份重要的文件以防万一。
参考文章
[1]
[2]
[3]
0 评论