kaisawind's blog
  • 关于
  • 所有帖子

git的subtree和submodule比较 - Wed, Jun 26, 2019

git subtree和submodule进行比较

1. 概述

项目越做越大,需要将微服务拆成单独的库进行维护。subtree和submodule进行到底使用哪个进行调研。

2. submodule(子模块)

子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

2.1 submodule命令

子模块基本命令

# 添加子模块
git submodule add https://github.com/kaisawind/submodule.git <submodule name>
# 初始化子模块
git submodule init
# 更新子模块
git submoduel update

克隆代码时使用--recursive参数能够将所有子模块都进行克隆

git clone --recursive https://github.com/kaisawind/test.git

比较方便的用法是进入到子模块目录,然后使用git命令

2.2 submodule问题点

  1. 当从有子模块的分支切换到没有子模块的分支会有未跟踪的子模块。

  2. 子模块添加之后会在根目录下添加.gitsubmodule文件,里面记录着所有的子模块。

  3. 克隆下来的子模块目录会有.git文件(非目录),会记录当前的commit号。

2.3 submodule使用

现在使用子模块是将前端代码插入到后端代码库中,然后通过后端的工具将前端代码生成后端代码。

3. subtree(子树)

与子模块相似,但是subtree不会插入代码库,而只是插入代码。

3.1 subtree命令

git subtree add   --prefix=<prefix> <commit>
git subtree add   --prefix=<prefix> <repository> <ref>
git subtree pull  --prefix=<prefix> <repository> <ref>
git subtree push  --prefix=<prefix> <repository> <ref>
git subtree merge --prefix=<prefix> <commit>
git subtree split --prefix=<prefix> [OPTIONS] [<commit>]

3.2 subtree问题点

  1. 命令比较复杂 --prefix需要制定subtree命令的文件夹 <repository>需要制定使用哪个库进行更新 <ref>需要更细的分支或者版本

  2. 由于同步subtree时需要用到<commit>,当父库同步到子库时,两个库将会相同,但是此时仍然需要将子库同步到父库,因为父库中子库的版本号发生了变化。

3.3 subtree使用

当父库不需要区分不同的代码库时,需要使用subtree。


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub