subtree和submodule的区别
subtree
subtree目录是没有带.git文件夹的,因为它是直接把子项目的代码合并到父级仓库中的,所以它不是一个独立的仓库,而是一个子目录。编辑的时候,直接在父级仓库中编辑就可以了,不需要进入子项目中编辑- 使用
subtree会在创建目录时生成commit
TIP
虽然,subtree的子项目没有了.git文件夹,但是还是可以使用pull和push命令的,需要借助subtree命令来操作git subtree pull/push
subtree是怎么记录当前是否有新的commit记录
它是利用git subtree add的时候生成的commit,然后在这个commit中将这个记录有变动的文件/文件夹的hash记录下来,然后在pull和push的时候,会对比这个hash,如果不一样,就说明有新的commit,就会进行pull和push操作
submodule
- 用于在一个项目中添加另外一个项目,会生成一个
.gitmodules的文件,用来记录子项目的信息 - 父级仓库只会记录
submodules中的URL和最新的COMMIT,而不会记录子项目的代码 submodule和submodule之间可以嵌套,形成一个树状结构的submodulesubmodule可以单独使用pull、push、checkout等命令
TIP
在拉去含有submodule的项目时,可以使用git clone --recurse-submodules命令,这样就会将子项目的代码也一并拉取下来
这等价于
bash
git submodule update --init --recursive区别
subtree是将子项目的代码合并到父级仓库中,而submodule是将子项目的代码作为一个子目录存在于父级仓库中