Skip to content
📁 标签
GIT

subtree和submodule的区别

subtree

  • subtree目录是没有带.git文件夹的,因为它是直接把子项目的代码合并到父级仓库中的,所以它不是一个独立的仓库,而是一个子目录。编辑的时候,直接在父级仓库中编辑就可以了,不需要进入子项目中编辑
  • 使用subtree会在创建目录时生成commit

TIP

虽然,subtree的子项目没有了.git文件夹,但是还是可以使用pullpush命令的,需要借助subtree命令来操作git subtree pull/push

subtree是怎么记录当前是否有新的commit记录

它是利用git subtree add的时候生成的commit,然后在这个commit中将这个记录有变动的文件/文件夹的hash记录下来,然后在pullpush的时候,会对比这个hash,如果不一样,就说明有新的commit,就会进行pullpush操作

submodule

  • 用于在一个项目中添加另外一个项目,会生成一个.gitmodules的文件,用来记录子项目的信息
  • 父级仓库只会记录submodules中的URL和最新的COMMIT,而不会记录子项目的代码
  • submodulesubmodule之间可以嵌套,形成一个树状结构的submodule
  • submodule可以单独使用pullpushcheckout等命令

TIP

在拉去含有submodule的项目时,可以使用git clone --recurse-submodules命令,这样就会将子项目的代码也一并拉取下来

这等价于

bash
git submodule update --init --recursive

区别

  • subtree是将子项目的代码合并到父级仓库中,而submodule是将子项目的代码作为一个子目录存在于父级仓库中