github在大半年前就允许个人付费用户创建无限个数的私有git仓库,对于个人开发者来说这是一个很好福利。 不过每个仓库是有大小限制的,最大不超过1G。但是一个完整的项目,带上文档和资源很轻松就超过1G。 超过后就必须再付费,每50G/5美元为单位进行再付费。所以为了节省成本,可以把项目拆分到不同的子模块中, 在不同仓库进行分存就可以不超过github的限制。
子模块其实也是一个完整的git仓库,如果单独去维护子模块则跟普通git仓库的操作一致。 但是从父项目的角度来维护,则有一些不同之处。以下是子模块的基本用法和常见的问题。
创建子模块
git submodule add git://github.com/Someone/SomeRepo.git
创建完成后,会生成.gitmodules文件
cat .gitmodule
[submodule "SomeRepo"]
path = SomeRepo
url = git://github.com/Someone/SomeRepo.git
更新子模块
git submodule update
本质上,子模块和父项目是不同的仓库。这里有个坑。 git pull并不会更新子模块,此时执行git status发现子模块有更新,则需要执行 git submodule update. 所以正确的更新方式是
git pull
git submodule update
修改子模块
默认情况下,进入子模块HEAD是处理游离状态(detached HEAD), 所以如果要更新子模块,就先要checkout到master
cd submodule_folder
git checkout master
do some mod
git add files
git commit -m 'Mod submodule'
git push
如果开始一开始忘记checkout到master并且有进行commit, 则可以采用如下办法
mod submodule files and commited
git log #查看commit hash id 假定id是12345
git checkout master
git cherry-pick 12345
git push
删除子模块
最简单的方法就是编辑.gitmodule文件把相关信息删除,然后再从文件系统把子模块相关目录删除。
- [submodule "SomeRepo"]
- path = SomeRepo
- url = git://github.com/Someone/SomeRepo.git