当前位置:   article > 正文

【git】git项目的子模块管理-使用Git Submodule管理子模块_git 查看依赖的子项

git 查看依赖的子项

推荐文章:Git中submodule的使用 - 知乎

使用场景

基于公司的项目会越来越多,常常需要提取一个公共的类库提供给多个项目使用,但是这个library怎么和git在一起方便管理呢?
我们需要解决下面几个问题:

  • 如何在git项目中导入library库?

  • library库在其他的项目中被修改了可以更新到远程的代码库中?

  • 其他项目如何获取到library库最新的提交?

  • 如何在clone的时候能够自动导入library库?

解决以上问题,可以考虑使用git的 Submodule来解决。

什么是Submodule?

git Submodule 是一个很好的多项目使用共同类库的工具,他允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commitpushpull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会的提交信息包含Submodule的信息,再clone父项目的时候可以把Submodule初始化。

在项目中使用Submodule

如何使用

1. 创建带子模块的版本库

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

  1. project
  2. |--moduleA
  3. |--readme.txt

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

  1. git init --bare project.git
  2. git clone project.git project1
  3. cd project1
  4. echo "This is a project." > readme.txt
  5. git add .
  6. git commit -m "add readme.txt"
  7. git push origin master
  8. cd ..

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

  1. git init --bare moduleA.git
  2. git clone moduleA.git moduleA1
  3. cd moduleA1
  4. echo "This is a submodule." > a.txt
  5. git add .
  6. git commit -m "add a.txt"
  7. git push origin master
  8. cd ..

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

  1. cd project1
  2. git submodule add ../moduleA.git moduleA
  3. git status
  4. git diff
  5. git add .
  6. git commit -m "add submodule"
  7. git push origin master
  8. cd ..

使用git status可以看到多了两个需要提交的文件,其中.gitmodules指定submodule的主要信息,包括子模块的路径和地址信息,moduleA指定了子模块的commit id,使用git diff可以看到这两项的内容。这里需要指出父项目的git并不会记录submodule的文件变动,它是按照commit id指定submodule的git header,所以.gitmodulesmoduleA这两项是需要提交到父项目的远程仓库的。

  1. On branch master
  2. Your branch is up-to-date with 'origin/master'.
  3. Changes to be committed:
  4. (use "git reset HEAD <file>..." to unstage)
  5. new file: .gitmodules
  6. new file: moduleA

2. 克隆带子模块的版本库

方法一,先clone父项目,再初始化submodule,最后更新submodule,初始化只需要做一次,之后每次只需要直接update就可以了,需要注意submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。

  1. git clone project.git project2
  2. cd project2
  3. git submodule init
  4. git submodule update
  5. cd ..

方法二,采用递归参数--recursive,需要注意同样submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。

git clone project.git project3 --recursive

3. 修改子模块

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

  1. cd project1/moduleA
  2. git branch
  3. echo "This is a submodule." > b.txt
  4. git add .
  5. git commit -m "add b.txt"
  6. git push origin master
  7. cd ..
  8. git status
  9. git diff
  10. git add .
  11. git commit -m "update submodule add b.txt"
  12. git push origin master
  13. cd ..

4. 更新子模块

更新子模块的时候要注意子模块的分支默认不是master。

方法一,先pull父项目,然后执行git submodule update,注意moduleA的分支始终不是master。

  1. cd project2
  2. git pull
  3. git submodule update
  4. cd ..

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

  1. cd project3/moduleA
  2. git checkout master
  3. cd ..
  4. git submodule foreach git pull
  5. cd ..

5. 删除子模块

网上有好多用的是下面这种方法

  1. git rm --cached moduleA
  2. rm -rf moduleA
  3. rm .gitmodules
  4. vim .git/config

删除submodule相关的内容,例如下面的内容

  1. [submodule "moduleA"]
  2. url = /Users/nick/dev/nick-doc/testGitSubmodule/moduleA.git

然后提交到远程服务器

  1. git add .
  2. git commit -m "remove submodule"

但是我自己本地实验的时候,发现用下面的方式也可以,服务器记录的是.gitmodulesmoduleA,本地只要用git的删除命令删除moduleA,再用git status查看状态就会发现.gitmodules和moduleA这两项都已经改变了,至于.git/config,仍会记录submodule信息,但是本地使用也没发现有什么影响,如果重新从服务器克隆则.git/config中不会有submodule信息。

  1. git rm moduleA
  2. git status
  3. git commit -m "remove submodule"
  4. git push origin master

git submodule 指定依赖子模块的版本

在git submodule中可以指定子模块的版本,方法就是,首先添加子模块,然后cd到子模块,checkout到指定的版本,然后提交就可以了。

这个链接里面,详细讲述其他操作:Git submodule 子模块的管理和使用 - 简书


链接:https://www.jianshu.com/p/7fc4218d3346
 

参考和摘抄自原文:

https://segmentfault.com/a/1190000003076028

Git Submodule管理项目子模块 - nicksheng - 博客园

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号