Git管理子项目

事情起源于我写的PHP轻量框架DappurWF,其中包含一个blog作为demo;但与此同时,这个运行在DappurWF上的blog也是我的私人博客成品。伴随着框架的逐渐完善和博客在服务器上的搭建,两者的更新需要分别进行;不能再像之前那样揉在同一个项目中,彼此的提交记录交错混杂在一起。

为了解决这个问题,需要借助git提供的subtree功能,该功能允许一个独立子项目以子目录的形式存在于主项目中,两者的提交互不影响,但可以通过命令彼此同步。

分离项目

subtree可以将子项目以子目录的形式并入主项目,因此主项目和子项目在一开始应该是彼此分离的。在我的情境下,blog一开始就是包含在DappurWF内的,所以需要先将blog作为单独的项目分离出去。

1、把将作为子项目的部分作为单独分支分离出去

cd <path-main-repo>
git subtree split -P <dir-sub> -b <name-new-branch>
cd -

2、在任意位置创建一个目录作为子项目,并将主项目的新分支(仅包含子项目文件)pull进来

mkdir <path-sub-repo>
cd <path-sub-repo>
git init
git pull <path-main-repo> <name-new-branch>

3、将子项目同步到远程仓库

git remote add origin <remote-sub-repo>
git push origin -u master

4、清除主项目中的数据

cd <path-main-repo>
git rm -rf <dir-sub>
git commit -m "remove sub part"
git branch -D <name-new-branch>

并入子项目

现在主项目和子项目已经彼此分离了,可以借助于subtree命令将后者以目录方式并入前者

git remote add -f <name-remote> <remote-sub-repo>
git subtree add -P <dir-sub> <name-remote> master
git push origin master

后期维护

推送子目录

git subtree push -P <dir-sub> <name-remote>

拉取子目录

git subtree pull -P <dir-sub> <name-remote>

subtree&submodule

subtree会把子项目拷贝至主项目中,而submodule只会保留一个指向子项目的链接

在本例中,blog作为主项目的demo,始终存在于主项目中,故使用subtree更妥。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://local_ubuntu/blog/?id=6

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。