背景

感觉自己比较啰嗦,什么时候总想交代一下缘由。 故事的的开始是,我在使用 hexo 的时候, 想用git 做一下版本管理。为了主题能够方便升级(也许我以后一直不会升级的), 直接clone了原始库。做完自己的配置后,回不到原始库就推到了码云 上了。为什么要退到码云上,是因为它可以建免费的私有项目,我又没有自己的网络主机。之后问题就出来了,我有两个库,一个是文章的,一个是主题加主题配置的,怎么管理。

git子模块

网上看了半天,选定了 git 子模块的解决办法。可能一次说不完所有的,我遇到那些说那些吧。

增加子模块

1
2
# 官网的指导说执行下面的命令,就可以将 DbConnector 库添加到当前路径下,作为子模块
git submodule add https://github.com/chaconinc/DbConnector

等等,我这里是准备用来做主题的,不能直接放到根目录下面,所以执行了下面的命令

1
 git submodule add https://github.com/iissnan/hexo-theme-next themes/next

这样,在根目录下就有了 themes/next 目录,这个目录里面就是主题的各种文件了。

子模块的基本操作

子模块毕竟不是在一个仓库里面的,看着官网的说明,感觉好复杂,差点想要放弃(反正我也不一定回去更新主题,即使更新,大不了再下载一下,成本貌似更低)。

本地子模块工作

在子模块下面工作可以当作是在单独的仓库工作一样,正常的 add commit pull push , 因为我是一个人工作, 目前还是在一台机器上,所有很多问题没有遇到。当主模块要提交时,需要执行 git push --recurse-submodules=check ,推送时检查子模块的状态。

clone包含子模块的仓库

仓库拷贝与初始化

包含有子模块的仓库拷贝有点特殊的地方,完成拷贝后,需要执行下面的命令

1
2
3
4
5
6
7
8
# 拷贝仓库
git clone git@github.com/XXX/xxx.git

# 初始化 子模块
git submodule init

# 更新子模块内容
git submodule update

上层项目的操作

子模块外的操作基本与一般的仓库操作一样,没有太多的区别。还是要注意一下问题。

  1. 当需要更新 子模块的最新代码时,需要执行下面的命令
1
2
3
 git merge origin/master

 git submodule update

子模块的操作

子模块有个问题,运行git submodule update,它会检出指定项目的指定版本,但是不在分支内。这叫获得一个分离的头,因为HEAD指向的是一次提交,而不是一个引用的符号,在分离的头环境下工作很容易丢失变更。如果要在子模块里面工作,建议创建一个分支,或者使用该提交的分支(例如,配置文件就我自己用,我一直工作在 master上)

踩过的坑

  1. 不要在向里面包含非子模块的仓库,

参考资料

  1. 子模块:一个仓库包含另一个仓库
  2. 7.11 Git 工具 - 子模块