当前位置:   article > 正文

Git 子模块

子模块分支 gitmodules 博客

Git 子模块

0. 子模块信息

.gitmodules文件用来保存子模块的信息。

1. 查看子模块

  1. $ git submodule
  2. # 已检出子模块代码
  3. cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)
  4. # 前面带 - 表示未检出代码,子模块是空文件夹
  5. -cedbe91340dbcff661fa089b116441b11b050d38 themes/hugo-nuo (heads/master)

2. 创建子模块

2.2 方法1

  1. # 在父项目仓库目录下
  2. # Usage
  3. $ git submodule add [url] [path]
  4. # with path
  5. $ git submodule add http://202.38.69.179:8000/ahxieqi/test-submdl.git testsubmdl
  6. # 在当前本地仓库testsubmdl文件夹下创建子模块
  7. # without path
  8. $ git submodule add http://202.38.69.179:8000/ahxieqi/test-submdl.git
  9. # 在当前本地仓库当前文件夹下创建子模块

2.3 方法2

例如我们要创建如下结构的项目

project
  |–moduleA
  |–readme.txt

创建project版本库,并提交readme.txt文件

  1. $ git init --bare project.git # 将初始化的裸库,存放在project.git文件夹下
  2. $ git clone project.git project1 # 将project.git库,存放在project1文件夹下
  3. $ cd project1 # 进入project1文件夹
  4. $ echo "This is a project." > readme.txt # 创建并写入 a.txt 文件
  5. $ git add . # 将修改添加到暂存区
  6. $ git commit -m "add readme.txt" # 将 a.txt 提交到本地库
  7. $ git push origin master # 将修改推送到远程库
  8. $ cd ..

创建moduleA版本库,并提交a.txt文件

  1. $ git init --bare moduleA.git # 将初始化的裸库,存放在moduleA.git文件夹下
  2. $ git clone moduleA.git moduleA1 # 将moduleA.git库,存放在moduleA1文件夹下
  3. $ cd moduleA1 # 进入moduleA1文件夹
  4. $ echo "This is a submodule." > a.txt # 创建并写入 a.txt 文件
  5. $ git add . # 将修改添加到暂存区
  6. $ git commit -m "add a.txt" # 将 a.txt 提交到本地库
  7. $ git push origin master # 将修改推送到远程库

在project项目中引入子模块moduleA,并提交子模块信息

  1. $ cd project1 # 进入project1文件夹
  2. $ git submodule add ../moduleA.git moduleA # 在moduleA目录下添加子模块
  3. $ git status
  4. $ git diff
  5. $ git add . # 将修改添加到暂存区
  6. $ git commit -m "add submodule" # 将修改添加到本地库
  7. $ git push origin master # 将修改添加到远程库

3. 修改子模块

修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响。如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。

  1. # 在主项目里修改 submodule
  2. $ cd project1/moduleA
  3. $ git branch
  4. $ echo "This is a submodule." > b.txt
  5. $ git add .
  6. $ git commit -m "add b.txt"
  7. $ git push origin master # 将修改同步到子模块的远程库
  8. $ cd ..
  9. $ git status
  10. $ git diff
  11. $ git add .
  12. $ git commit -m "update submodule add b.txt"
  13. $ git push origin master # 将修改同步到父项目的远程库

4. 更新子模块

先进入子模块,然后切换到需要的分支,这里是master分支,然后对子模块pull,这种方法会改变子模块的分支。

  1. $ cd [submodule_folder] # 进入子模块目录
  2. $ git checkout master # 切换到需要的分支,默认子模块分支不是master分支
  3. $ cd .. # 进入父项目目录
  4. $ git submodule foreach git pull # pull 子模块的更新
  5. $ git status
  6. $ git add .
  7. $ git commit -m 'update submodule add c.txt'
  8. $ git push origin master # 更新父项目下的子模块

5. 克隆包含子模块的项目

5.1 方法1

先克隆父项目,再更新子模块

  1. # 1. 克隆父项目
  2. $ git clone https://github.com/maonx/vimwiki-assets.git assets
  3. # 2. 查看子模块
  4. $ git submodule
  5. -e33f854d3f51f5ebd771a68da05ad0371a3c0570 assets
  6. # 子模块前面有一个-,说明子模块文件还未检入(空文件夹)。
  7. # 3. 初始化子模块
  8. $ git submodule init
  9. Submodule 'assets' (https://github.com/maonx/vimwiki-assets.git) registered for path 'assets'
  10. # 初始化模块只需在克隆父项目后运行一次。
  11. # 4. 更新子模块
  12. $ git submodule update
  13. Cloning into 'assets'...
  14. ...
  15. Submodule path 'assets': checked out 'e33f854d3f51f5ebd771a68da05ad0371a3c0570'

5.2 方法2

递归克隆整个项目

  1. git clone --recursive https://github.com/maonx/vimwiki-assets.git assets
  2. # 递归克隆整个项目,子模块已经同时更新了,一步到位。

6. 删除子模块

  1. # 1. 删除子模块文件夹
  2. $ git rm --cached assets
  3. $ rm -rf assets
  4. # 2. 删除.gitmodules文件中相关子模块信息
  5. [submodule "assets"]
  6. path = assets
  7. url = https://github.com/maonx/vimwiki-assets.git
  8. # 3. 删除.git/config中的相关子模块信息
  9. [submodule "assets"]
  10. url = https://github.com/maonx/vimwiki-assets.git
  11. # 4. 删除.git文件夹中的相关子模块文件
  12. $ rm -rf .git/modules/assets

参考链接:

http://www.cnblogs.com/nicksheng/p/6201711.html
https://laozhu.me/post/git-submodule-tutorial/

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号