git submodule 添加,更新与删除

git submodule 是一个很好的多项目使用共同类库的工具,它允许类库项目作为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己独立的commit、push、pull。而父项目以submodule的形式包含子项目,父项目可以指定子项目header、父项目中的提交信息包含submodule信息,再clone父项目的时候可以把Submodule初始化,使用方法如下:
一、如何在主工程中添加submodule
1、进入到主工程的目录、执行如下命令
在主工程中添加一个submodule的
$ git submodule add https://gitee.com/ddonggua/submoudle.git
Cloning into ‘D:/gitproject/Test/submoudle’…
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your working directory.
默认情况下、子模块会将子项目放到一个与仓库同名的目录中
如果这是执行git status,你会注意到几个东西
Your branch is up to date with ‘origin/master’.

Changes to be committed:
(use “git reset HEAD …” to unstage)

new file: .gitmodules
new file: submoudle
.gitmodules该文件中保存了子项目URL和已经拉取的本地目录之间的映射
$ cat .gitmodules
[submodule “submoudle”]
path = submoudle
url = https://gitee.com/ddonggua/submoudle.git
如果有多个文件,该文件有多条记录
2、git add *
3、git commit -m “directions”
4、将本地提交更新到主工程的远程仓库
这样主工程就把对submodule的依赖关系提交到远程仓库了

二、克隆含有子模块的项目
接下来我们我们会clone一个含有子项目的功臣
1、 git clone https://gitee.com/ddonggua/Test2.git
Cloning into ‘Test2’…
remote: Enumerating objects: 85, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 85 (delta 9), reused 0 (delta 0)
Unpacking objects: 100% (85/85), done.
这是进入到Test2目录发现
$ git clone https://gitee.com/ddonggua/Test2.git
Cloning into ‘Test2’…
remote: Enumerating objects: 85, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 85 (delta 9), reused 0 (delta 0)
Unpacking objects: 100% (85/85), done.

wangyue@ZZ-RDC-00074A MINGW64 /d/gitproject/ddddd
$ cd Test2/

工程Test2包含子项目的submodule目录、但是你会发现submodule是空的
wangyue@ZZ-RDC-00074A MINGW64 /d/gitproject/ddddd/Test2 (master)
$ cd submoudle

wangyue@ZZ-RDC-00074A MINGW64 /d/gitproject/ddddd/Test2/submoudle (master)
$ ls

这时必须执行submodule的初始化:git submodule init和git submodule update 则从子项目中抓取所有数据
$ git submodule init
Submodule ‘submoudle’ (https://gitee.com/ddonggua/submoudle.git) registered for path ‘./’
Submodule ‘submoudle2’ (https://gitee.com/ddonggua/submoudle2.git) registered for path ‘../submoudle2’

wangyue@ZZ-RDC-00074A MINGW64 /d/gitproject/ddddd/Test2/submoudle (master)

$ git submodule update

Cloning into ‘D:/gitproject/ddddd/Test2/submoudle’…
Cloning into ‘D:/gitproject/ddddd/Test2/submoudle2’…
Submodule path ‘./’: checked out ‘d49ee61ee18b5fa794dd4f71c3428bf4876921c3’
Submodule path ‘../submoudle2’: checked out ‘20387903799b25efb41d8d3af97a08a8b067051f’
这时就讲submodule的工程更新到本地了
三、subm子仓库更新
主工程依赖的字仓库更新了,主工程如何更新
1、更新主仓库
2、git submodule update –remote
这样会将子仓库的更新拉取下来
如果远程仓库有跟新
$ git status
On branch master
Your branch is up to date with ‘origin/master’.

Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout – …” to discard changes in working directory)

modified: submoudle (new commits)

no changes added to commit (use “git add” and/or “git commit -a”)

在你的主工程下面会看见如下变更,这时,如果将此变更提交到主仓库的远程服务器
其他的开发人员执行update 之后就会将submoudle的更新拉取到本地
四、删除submoudle
git 并不支持直接删除Submodule需要手动删除对应的文件:
cd mainproject git rm –cached submodule rm -rf submodule 以上将submodule文件删除
删除.gitmodules中对应的submodule的信息,如下红色部分所示
$ cat .gitmodules
[submodule “submoudle”]
path = submoudle
url = https://gitee.com/ddonggua/submoudle.git
[submodule “submoudle2”]
path = submoudle2
url = https://gitee.com/ddonggua/submoudle2.git

更改git的配置文件config: vim .git/config
可以看到Submodule的配置信息:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote “origin”]
url = https://gitee.com/ddonggua/Test2.git
fetch = +refs/heads/:refs/remotes/origin/
[branch “master”]
remote = origin
merge = refs/heads/master
[submodule “submoudle”]
active = true
url = https://gitee.com/ddonggua/submoudle.git
[submodule “submoudle2”]
active = true
url = https://gitee.com/ddonggua/submoudle2.git

删除submodule相关的内容[红色部分],
这是还未将submodule的信息清空,任然需要将 modules目录下的submoudle删除
这样就彻底将submodule的信息删除了,然后提交到远程仓库,over

发布了16 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41163331/article/details/81672836