赞
踩
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。
Git通过子模块来解决这个问题。 子模块允许你将一个Git仓库作为另一个Git仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
git submodule add xxxxxxx.git shares-folder,其中shares-folder是文件夹名可以自己指定
比如我们需要在主项目mainProject中添加子模块project1
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个变化,新增了两个文件.gitmodules
project1(实际上并不是一个file),会有一个游离态hash分支,我们在子模块修改代码,提交时注意切换分支,不要在游离分支进行操作,否则会出现一些问题。切记在当前分支提交或拉取,不要在游离分支上做任何处理
保存项目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
参数,修改提交后对所有用户有效。在我们平常的开发中,有添加子模块的需求,当然也会有删除子模块的需求。
使用git rm --cached project1 将project1从版本控制中删除(本地仍保留有),若不需要可不带
–cached进行完全删除。
使用vim .gitmodules
打开vim编辑,删除对应的内容
[submodule "project1"]
path = "project1"
url = "https://github.com/xxx/project1.git"
branch = dev
使用vim .git/config
打开vim编辑,删除对应的内容
[submodule "liba"]
url = https://github.com/xxx/project1.git
active = true
使用 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。