git的subtree和submodule比较

  1. 1. 概述
  2. 2. submodule(子模块)
    1. 2.1 submodule命令
    2. 2.2 submodule问题点
    3. 2.3 submodule使用
  3. 3. subtree(子树)
    1. 3.1 subtree命令
    2. 3.2 subtree问题点
    3. 3.3 subtree使用

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。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

💰

×

Help us with donation