当前位置:   article > 正文

模块化 git管理_gitlab 一个项目多个模块

gitlab 一个项目多个模块

https://www.cnblogs.com/nicksheng/p/6201711.html

 

使用场景

当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。

常用命令

  1. git clone <repository> --recursive 递归的方式克隆整个项目
  2. git submodule add <repository> <path> 添加子模块
  3. git submodule init 初始化子模块
  4. git submodule update 更新子模块
  5. git submodule foreach git pull 拉取所有子模块

如何使用

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/584116
推荐阅读
  

闽ICP备14008679号