Git 子模块:git submodule

imtianx

2018年03月08日阅读 2057

Git 子模块:git submodule

工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景。比如,在项目中引用第三方库。或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景。这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目

可以使用 git submodule --help 查看所有相关命令。 为了方便说明,这里在主项目 MainProject中加两个子模块 libalibb .

1. 添加子模块

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

git clone https://github.com/imtianx/MainProject.git
cd MainProject/
git submodule add https://github.com/imtianx/liba.git
复制代码

如下图:

使用 git submodule add https://github.com/imtianx/libb.git 添加 libb 子模块。 对于上图,文件夹 liba 为新增加的子模块目录, .gitmodules 中存放的为子模块的信息,使用 catvim查看内容为:

[submodule "liba"]
	path = liba
	url = https://github.com/imtianx/liba.git
[submodule "libb"]
	path = libb
	url = https://github.com/imtianx/libb.git
复制代码

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

此时文件目录树如下:

.
├── README.md
├── liba
│   ├── README.md
│   ├── a.txt
│   └── a2.txt
├── libb
│   ├── README.md
│   ├── b.txt
│   └── b2.txt
└── test.text

复制代码

最后,提交添加的子模块到主目录

$ git commit -m "add liba and libb submodules"
[master 6b15e30] add liba and libb submodules
 3 files changed, 8 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 liba
 create mode 160000 libb
复制代码

2. 更新子模块

往往子模块是单独开发的,这里以更新 liba 为例(为了测试,这里先在liba仓库添加了一个文件):

cd liba/
git fetch
git merge origin/master
复制代码

操作结果如下图,注意需要进入子模块目录

此外,还可以在主目录下 直接用下面的命令更新 libb子模块:

git submodule update --remote liba
复制代码

使用下面的方式,更新 libbdev 分支:

git config -f .gitmodules submodule.liba.branch dev
git submodule update --remote
复制代码

如下图:

这里对 .gitmodules 加了 -f 参数,修改提交后对所有用户有效。

3. 删除子模块

在日常开发中,有添加,当然也会有删除 子模块的需求。 这里主项目包含两个子模块:libalibb,以删除 liba 为例说明:

  • 使用 git rm --cached liba 将liba 从版本控制中删除(本地仍保留有),若不需要可不带 --cached进行完全删除。
  • 使用 vim .gitmodules 可打开vim编辑,删除对应的内容
 [submodule "liba"]
          path = liba
          url = https://github.com/imtianx/liba.git
          branch = dev
复制代码
  • 使用 vim .git/config 可打开vim编辑,删除对应的内容
[submodule "liba"]
         url = https://github.com/imtianx/liba.git
         active = true
复制代码
  • 使用 rm -rf .git/modules/liba, 删除.git下的缓存模块,最后提交项目。

经过上面的删除后还可以进行添加子模块。

4. 克隆含子模块的仓库

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

git clone --recursive https://github.com/imtianx/MainProject.git
复制代码

或者使用下面的三部操作:

git clone  https://github.com/imtianx/MainProject.git
git submodule init
git submodule update
复制代码

更多子模块的操作,请参考官方文档:Git 工具 - 子模块

原文地址:https://www.cnblogs.com/cute/p/10007508.html

时间: 2024-11-07 14:42:26

Git 子模块:git submodule的相关文章

Git 子模块 - submodule(转)

原文地址: http://www.cnblogs.com/kelsen/p/5918672.html 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另一个. Git 通过子模块来解决这个问题. 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录. 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立. 开始使用子模块 git

Git 子模块 - submodule

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另一个. Git 通过子模块来解决这个问题. 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录. 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立. 开始使用子模块 git submodule add remotePath [localPath] 克隆含有子模块的项目 gi

辛星浅析git中的submodule

有时候,我们需要将一些通用的部分抽取出来做成一个公共库,它可以给别的工程使用,而公共代码库的版本管理是比较麻烦的.我们可以使用git中的submodule来做到这一点. 1.添加 为当前工程添加submodule,命令格式是:git   submodule   add   仓库地址    路径 在添加完成后,在当前工程路径下会生成一个名为".gitmodules"的文件,它记录了子模块的信息,添加完成之后,将子模块所在的文件夹添加到工程中即可. 2.删除 删除submodule,我们首

Git使用手册:为Git仓库创建Submodule

在实际开发中,经常会遇到下图所示的场景,多个不同的项目工程(工程1,工程2,工程3)中有一个相同的功能模块代码(LibA),这些功能模块可能在以后也会被其他项目工程所引用,按照下图所示,哪个工程需要这个LibA就直接将LibA的源代码引入到当下所需要的项目工程中,这样,我们就可以使用LibA所提供的功能进行开发,如果采用这种方式进行开发,将会面临一个问题,LibA中的功能进行了扩充,那么所有引用libA的工程项目就得重新删除旧的LibA然后再将新的LibA的代码引入到工程中,这种流程操作起来非常

git之git submodule

git之git submodule 场景一 在本地仓库中,添加远程仓库作为子仓库. 添加submodule工程 git submodule add XXX.git 在本地仓库中,添加一个空仓库作为子仓库 git add .gitmodules (sumodule-name) git commit git submodule init 提交submodule修改 如果修改了submodule仓库的内容 git status git add . git commit git push 然后在主仓库中

[Git] 使用 Git SubTree 来共享函示库源代码

采用 GitSubtree 的方式来共用多个 project 会共用的 sourceCode,不过 subtree 的数据似乎不多,查到的数据都没有顺利的让我完成我的 subtree 情境,所以自己参考数据并且尝试成功后,就写一篇 blog 来记录一下,希望 subtree 以后会更方便用 写在前面的前面 (2017/05/06更新) 经过了大概几个月的使用,近日决定放弃用 Subtree 改回用 SubModule,因为遇到了一些问题,最严重的是两个使用同一个 Subtree 会莫名的不同步,

Git Note - git tag

git tag is used to create labels, usually for version numbers. Format: git tag <TagName> <refer> Example: git tag v0.1 HEAD is to create a version number v0.1 on current HEAD. Notice: When you git push your code to remote server, you need to a

[Git] 还原Git上commit,但是没有push代码

直接在Idea上操作2步解决: 1. 找到: 2. 在To Commit里面填写:HEAD^,表示将commit的信息还原为上一次的,需要多次直接reset多次即可: 使用命令行:原理一样 以下内容转载: http://zhyq0826.iteye.com/blog/1671638 如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d86c505f4abe

Git - Basic Git Workflow

Definition Git is a software that allows you to keep track of changes made to a project over time.  Git works by recording the changes you make to a project, storing those changes, then allowing you to reference them as needed. Git project can be tho