当前位置:   article > 正文

git submodule_git submodule add

git submodule add

什么是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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

使用 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
引用之后文件夹没有内容

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

更新子模块

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

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

# 更新project1的dev分支
git config -f .gitmodules submodule.project1.branch dev
git submodule update --remote
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
注意:这里对.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
    
    • 1
    • 2
    • 3
    • 4
  3. 使用vim .git/config 打开vim编辑,删除对应的内容

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

克隆含有子模块的仓库

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

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

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

git clone  https://github.com/xxx/mainProject.git
git submodule init
git submodule update
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/458070
推荐阅读
相关标签
  

闽ICP备14008679号