当前位置:   article > 正文

Git 子模块和子树管理项目_git 子项目

git 子项目

子模块和子树管理多存储库共有子项目。

参与开源项目开发,用Git 管理源码。多依赖和/或子项目的项目。对开源组织,社区和产品单一来源文档和依赖棘手。文档和项目碎片化和冗余,难维护。

  • 必要性

单项目为存储库内子项目,传统方法把项目复制到父存储库,如要多父项目用同子项目?复制到所有父项目,更新时,每父项目修改,不可行。父项目冗余和数据不一致,更新和维护子项目困难。

  • Git 子模块和子树

用命令把子项目添加到任意数目项目,同步更新修改:Git 子模块(submodule)和 Git 子树(subtree)。模块化支持共用代码开发工作流,Git 存储库 源码管理(source-code management)(SCM)与子树架桥梁:

Git 子模块

Git 默认包提供子模块,把 Git 存储库嵌入其他存储库。Git 子模块指向子树某次提交:

文件夹@提交 Id 格式表明是子模块,点文件夹进子树。 .gitmodules 配置文件含子模块存储库详细信息:

查看子模块 :

  1. $ git submodule
  2. e23e823d3f51f5ebd731a68da05ad0371c3a0231 test (heads/master)

更新子模块 :

  1. $ git submodule update
  2. $ git submodule update --remote

递归克隆子模块 :

$ git clone https://github.com/cain/cain-test.git test --recursive 

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

  1. $ git clone https://github.com/cain/cain-assets.git test
  2. $ git submodule
  3. --e23e823d3f51f5ebd731a68da05ad0371c3a0231 test
  4. $ git submodule init
  5. Submodule 'test' (https://github.com/cain/cain-test.git) registered for path 'test'
  6. $ git submodule update
  7. Cloning into 'test'...
  8. remote: Counting objects: 151, done.
  9. remote: Compressing objects: 100% (80/80), done.
  10. remote: Total 151 (delta 18), reused 0 (delta 0), pack-reused 70
  11. Receiving objects: 100% (151/151), 1.34 MiB | 569.00 KiB/s, done.
  12. Resolving deltas: 100% (36/36), done.
  13. Checking connectivity... done.
  14. Submodule path 'test': checked out 'e23e823d3f51f5ebd731a68da05ad0371c3a0231'
  15. $ git submodule update --init

如有嵌套子模块:

$ git submodule update --init --recursive

下载子模块

连续下载多个模块很枯燥,clone 和 submodule update 支持 --jobs (或 -j)参数:

如,一次下载 8 个子模块:

  1. $ git submodule update --init --recursive -j 8
  2. $ git clone --recursive --jobs 8 <URL to Git repo>

添加子模块:

  1. $ git submodule add https://github.com/cain/cain-test.git test
  2. $ git status
  3. On branch master
  4. Initial commit
  5. Changes to be committed:
  6. (use "git rm --cached <file>..." to unstage)
  7. new file: .gitmodules
  8. new file: test

删除子模块 :

  1. $ git rm --cached test
  2. $ rm -rf test
  3. $ git rm -f childmodule

删除.gitmodules子模块信息 

  1. [submodule "assets"]
  2. path = test
  3. url = https://github.com/cain/cain-test.git
  4. [submodule "test"]
  5. url = https://github.com/cain/cain-test.git

删除.git/config子模块信息 

  1. [submodule "test"]
  2. url = https://github.com/cain/cain-test.git


Git 子树( subtree), Git 1.7.11 引入,把副本为子目录嵌入。注入和管理依赖的方法。常规提交保存外部依赖信息。Git 子树提供集成点,容易复原。

如参考 GitHub 子树教程,本地看不到 .gittrees 。子树副本, .gittrees 配置文件git-subtree 命令, /contrib/subtree 文件夹 下载 git-subtree。

父存储库中有整个子树副本,因此克隆会持续很长时间。

父存储库中添加子树,先 remote add,后 subtree add 命令:

  1. $ git remote add remote-name <URL to Git repo>
  2. $ git subtree add --prefix=folder/ remote-name <URL to Git repo> subtree-branchname


把整个子项目提交历史合并到父存储库。

向子树推送修改及从子树拉取修改

$ git subtree push-all

$ git subtree pull-all


工具都有优缺点。适合特性:

Git 子模块存占用空间小,只指向子项目提交链接,而 Git 子树保存整个子项目及提交历史。
Git 子模块需服务器可访问,但子树去中心化。
Git 子模块基于组件开发,而 Git 子树基于系统开发。
Git 子树不是 子模块替代项。明确说明来指导用哪种。如有归属外部库,回推代码,用 Git 子模块,因推送代码更容易。如有第三方代码,且不推送,用 Git 子树,因拉取代码更容易。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/743249
推荐阅读
相关标签
  

闽ICP备14008679号