事情起源于我写的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更妥。
我要评论