如何在Github上使用Git subtree来管理父子项目

背景

对于经常玩Github的肯定注意到了某些开源项目会与主项目与发布项目之分,比如YII-dev主项目与发布项目YII,主项目包含了框架代码,测试文档,说明文档,整个项目达到上百M,如果把整合项目都让开发者down下来肯定很不人性化,对于国内用户肯定要哭了.YII考虑到这个问题,因此构建了发布项目,只包含核心源代码,这样容量就小多了,是不是感觉到YII很贴心.同时两个项目还保留同样的commit history,整体看起来好舒服.那么我们如何实现类似的git工作流呢?

实践

首先来看比较经典的git项目目录
project
--build
--doc
--src,
--tests
这样类似的目录,这就是我们的主项目.而经常会把src做为子项目,独立为新的git项目.
下面来讲在已经有主项目的情况下如何构建子项目,来我们一步步来实践.

我们发现相关的git核心命令是subtree,先了解一下文档git-subtree
通过文档上的内容,我们很容易得出这样的实现步骤:

1.初始化子项目

cd project
//添加源,你已经在github上建立了子项目仓库.
git remote add srcProject https://github.com/xxxx/子项目.git

2.直接提交子项目

git subtree push -P src srcProject master

一切顺利的话,git就已经在完成命令了,然后上github上src上的代码已经进入子项目仓库中,是不是so easy.然而这么快就结束了吗?多试几次,你会发现每次push命令都会遍历全部的commit,当你的项目越来越大,commit的数上来的时候,等待时间就会很长.我们再看看进阶的命令.

3.使用split

git subtree split --rejoin --prefix=src --branch srcTemp
git push srcProject srcTemp:master

--rejoin 避免了遍历全部commit的问题.

再多一点

实践中,项目经常是一个团队协作的多人开发,可以这么来分角色,开发组可以只引用主项目.项目发布者来负责子项目的更新与发布.
1.为主项目独立建立仓库目录.注:发现使用git desktop时,使用subtree命令也会出现在commit项中,为了避免主项目commit中出现多余的项,建议不要与开发目录相同.
2.当需要发布的时候,pull主项目源代码,然后按照subtree的命令进行发布.
3.使用github来发布版本.

阅读 4.5k

推荐阅读