Git SubTree
Git Subtree
Subtree vs Submodule
优点
subtree 更简洁
submodule
会在项目上创建一个.gitsubmodule
文件用于管理子项目。同时在 .git
上创建 .submodule
文件。而 subtree
只是在提交树上增加一个 commit,其他都没有。
subtree 操作更简单
submodule
使用上更繁琐,需要每个人都需要学会使用 submodule
命令初始化项目。
subtree
因为是直接把项目加入到当前的项目代码提交中,所以只要你 checkout
主项目就能有所有的代码。只有需要往子项目共享代码的才需要 subtree 怎么使用,不关心的人不需要知道 subtree
怎么使用
缺点
subtree
功能上没有 submodule
上丰富。对于不关心 sub 项目的人很友好,但是对于使用者来说,每次都需要加上 subtree
不是很友好,不过可以通过设置 alias
来避免这个问题,不过每次都要敲 --prefix
这个也是很蛋疼。如果是 submodule 的话,我只需要进入子项目的目录,就完全好像使用 git 原本的指令即可
共同问题
都是只能把整个项目加入到当前的项目上,并不能只是加入某个目录
Subtree 使用
添加子项目
git subtree add --prefix vim https://bitbucket.org/vim-plugins-mirror/vim-surround.git master --squash
--squash
是把子项目的提交变成一条添加到主项目中,如果不加,子项目所有的提交也会进入到主项目中
贡献代码给子项目
# 把子项目添加为一个 remote
git remote add sub https://bitbucket.org/vim-plugins-mirror/vim-surround.git
# 上传代码
git subtree push --prefex vim ${remote} ${branch}
# 例
git subtree push --prefex vim sub master
更新代码
# 基于添加 remote 的情况下
# 更新 sub 项目 master 分支下的代码变成一条提交到主项目上
git subtree pull --prefix vim sub master --squash
总结
subtree
虽然犹有不足,但是比 submodule
要好,是可以并且建议替代 submodule
使用。