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 使用。