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问题点
当从有子模块的分支切换到没有子模块的分支会有未跟踪的子模块。
子模块添加之后会在根目录下添加
.gitsubmodule
文件,里面记录着所有的子模块。克隆下来的子模块目录会有
.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问题点
命令比较复杂
--prefix
需要制定subtree命令的文件夹<repository>
需要制定使用哪个库进行更新<ref>
需要更细的分支或者版本由于同步subtree时需要用到
<commit>
,当父库同步到子库时,两个库将会相同,但是此时仍然需要将子库同步到父库,因为父库中子库的版本号发生了变化。
3.3 subtree使用
当父库不需要区分不同的代码库时,需要使用subtree。