git submodule

什么是git submodule?

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。

Git通过子模块来解决这个问题。 子模块允许你将一个Git仓库作为另一个Git仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

如何使用

常见命令

git submodule add xxxxxxx.git shares-folder,其中shares-folder是文件夹名可以自己指定

比如我们需要在主项目mainProject中添加子模块project1

添加子模块

进入mainProject使用 git submodule add 进行添加,操作命令:
git clone https://github.com/xxx/mainProject.git
cd mainProject/
git submodule add https://github.com/xxx/project1.git

# 指定子模块在主项目下的目录
git submodule add https://github.com/xxx/project1  src/submodulePath

使用 git submodule add https://github.com/xxx/project1.git 添加project1 子模块。文件夹 project1 为新增加的子模块目录, 但是里面是空的,啥都没有;.gitmodules 中存放的是子模块的信息。

新增成功之后,运行git status会在父仓库发现增加了2个变化,新增了两个文件
  1. .gitmodules

  2. project1(实际上并不是一个file),会有一个游离态hash分支,我们在子模块修改代码,提交时注意切换分支,不要在游离分支进行操作,否则会出现一些问题。切记在当前分支提交或拉取,不要在游离分支上做任何处理

gitmodules文件

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

[submodule "子模块名称"]
	path = "子模块在主项目中的路径"
	url = "子模块git地址"
	branch = "分支"
	
// 下面是具体信息
[submodule "project1"]
	path = "project1"
	url = "https://github.com/xxx/project1.git"
	branch = dev
引用之后文件夹没有内容

我们发现文件夹是有的但是里面没有内容,所以我们还需要其他命令来达到效果

cd mainProject
git submodule update --init 等同于git submodule init 和 git submodule update

// 初始化本地配置文件
git submodule init

// 从该项目中抓取所有数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update

# clone父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块
git clone --recursive https://github.com/xxx/mainProject

更新子模块

一般情况下子模块都是单独开发的,我们可以创建开发的分支然后进行开发

# master分支直接更新子模块代码
git submodule update --remote project1

# 更新project1的dev分支
git config -f .gitmodules submodule.project1.branch dev
git submodule update --remote
注意:这里对.gitmodules 加了-f 参数,修改提交后对所有用户有效。

删除子模块

在我们平常的开发中,有添加子模块的需求,当然也会有删除子模块的需求。

  1. 使用git rm --cached project1 将project1从版本控制中删除(本地仍保留有),若不需要可不带–cached进行完全删除。

  2. 使用vim .gitmodules 打开vim编辑,删除对应的内容

    [submodule "project1"]
    	path = "project1"
    	url = "https://github.com/xxx/project1.git"
    	branch = dev
    
  3. 使用vim .git/config 打开vim编辑,删除对应的内容

    [submodule "liba"]
             url = https://github.com/xxx/project1.git
             active = true
    
  4. 使用 rm -rf .git/modules/liba, 删除.git下的缓存模块,最后提交项目.

克隆含有子模块的仓库

如果需要克隆含有子模块的仓库,直接进行克隆是无法拉取子模块的代码,可加上 --recursive 参数,如下:

git clone --recursive https://github.com/xxx/mainProject.git

或者可以通过以下三个命令进行操作:

git clone  https://github.com/xxx/mainProject.git
git submodule init
git submodule update
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值