git 子模块的管理使用

#常用指令
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update or git submodule update --remote  更新子模块为远程项目的最新版本
git submodule foreach git pull 拉取所有子模块

1. 添加子模块

进入 MainProject 使用 git submodule add 进行添加,操作命令:

git clone git@github.com:haojiehappy/my_learning.git
cd my_learning/
git submodule add git@github.com:haojiehappy/test.git
	文件夹 test 为新增加的子模块目录, .gitmodules 中存放的为子模块的信息,使用 cat 或 vim 查看内容为:

	[submodule "test"]
		path = test
		url = it@github.com:haojiehappy/test.git

	.gitmodules文件:保存项目 URL 与已经拉取的本地目录之间的映射,有多个子模块则含有多条记录,会随着版本控制一起被拉去和推送的。

2.提交添加的子模块到主目录

#查看子模块
$ git submodule
git commit -m "add test"
git push origin main

3. 更新子模块

git submodule update //更新到之前的版本

submodule test 作者有更新,如何同步到我的项目?
更新submodule test
	cd test
	git pull origin main // git pull <远程> <分支> 这样可以解决“您当前不在一个分支上的问题”
回到主git仓库,查看状态,并提交
	cd ..
	git status
//输出结果有这样的内容,意思是submodule A有修改。add并提交即可
	modified:   A (new commits)
	git add .
	git commit -m 'update submodule'
	git push
你的同事或者协作的开发者,如何更新?
	git pull
	git submodule update

4. 下拉之后,在本地 修改子模块

修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响,如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。
cd test
git checkout main  
git branch
touch xxx.txt
git add .
git commit -m "add xxx.txt"
git push origin main
cd .. #回到主项目

git status
git add .
git commit -m "update submodule add xxx.txt"
git push origin main

5.删除子模块

网上流传了一些偏法,主要步骤是直接移除模块,并手动修改 .gitmodules、.git/config 和 .git/modules 内容。包含了一大堆类似git rm --cached <sub-module>、rm -rf <sub-moduel>、rm .gitmodules 和 git rm --cached 之类的代码。
实际上这是一种比较野的做法,不建议使用。

根据官方文档的说明,应该使用 git submodule deinit 命令卸载一个子模块。这个命令如果添加上参数 --force,则子模块工作区内即使有本地的修改,也会被移除。
git submodule deinit test
git rm test
执行 git submodule deinit test 命令的实际效果,是自动在 .git/config 中删除了以下内容:
[submodule "test"]
url = https://github.com/username/test.git

执行 git rm test 的效果,是移除了 test 文件夹,并自动在 .gitmodules 中删除了以下内容:

[submodule "test"]
path = test
url = https://github.com/username/test.git
此时,主项目中关于子模块的信息基本已经删除(虽然貌似 .git/modules 目录下还有残余):

➜ project-main git:(master) ✗ gs
位于分支 master
您的分支与上游分支 'origin/main' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: .gitmodules
删除: project-sub-1
可以提交代码:

git commit -m "delete submodule test"
至此完成对子模块的删除。

6. 克隆含子模块的仓库

若需要克隆含有子模块的仓库,直接 进行克隆是无法拉取之模块的代码,可加上 --recursive 参数,如下:
git clone --recursive git@github.com:haojiehappy/my_learning.git
复制代码或者使用下面的三部操作:
git clone  git@github.com:haojiehappy/my_learning.git
git submodule init
git submodule update
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值