月度归档:2016年12月

Git子模块的使用

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