hexo
中有着丰富的主题能够选择, 大部分的使用示例或者教程都是将主题 clone 到 theme 文件夹中来使用. 但这样来使用主题会存在以下的问题:git
.git
项目文件夹, 提交 hexo 项目时默认不会提交 theme 的 .git
文件夹, 在其余电脑上 clone 后会失去 theme 本来的版本控制功能.还好万能的 Git 针对这种问题已经有了成熟的解决方案, 经过自带的 Git submodules 功能便可优雅的避免以上的问题.程序员
Git submodules 称之为 Git 子模块. 子模块容许你将一个 Git 仓库做为另外一个 Git 仓库的子目录. 它可让你将另外一个仓库克隆到本身的项目中, 同时还保持提交的独立. 它很是适合咱们程序员在项目管理时遇到的一种状况: 某个工做中的项目须要包含并使用另外一个项目. 这些包含的项目也许是第三方库, 或者你独立开发的, 用于多个父项目的库. 你想要把它们当作两个独立的项目, 同时又想在一个项目中使用另外一个.github
在 hexo 中使用丰富的第三方主题的状况正很是符合这种情景.npm
了解了 Git submodles 的使用场景后, 这么强力的工具如何在 hexo 中来使用呢. 在这里演示下个人用法.浏览器
首先初始化一个用来演示的 hexo 项目:bash
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server
复制代码
执行以上操做后, 打开浏览器进入 http://localhost:4000/ 即可以预览到初始化好的 hexo 页面. 在项目的 theme
文件夹中能够看到使用了默认的 landscape
主题. 在这个 hexo 项目中创建起 Git 版本管理.服务器
git init
git commit -m 'initial project'
复制代码
如今一个 hexo 本地仓库已经创建好了并将初始化的文件提交了进去.hexo
如今咱们使用 Git submodules 的方式来选择一个第三方主题来替换本来的 landscape
主题. 这里选择我比较喜欢的的 pure 主题.编辑器
git submodule add https://github.com/cofess/hexo-theme-pure themes/pure
复制代码
git 便会将 hexo-theme-pure
主题做为一个项目子模块 clone 到 themes/pure 中. 同时 hexo 项目中会自动生成一个 .gitmodules
文件, 这个配置文件中保存了项目 URL 与已经拉取的本地目录之间的映射.工具
.gitmodules 文件内容
$ cat .gitmodules
[submodule "themes/pure"]
path = themes/pure
url = https://github.com/cofess/hexo-theme-pure
复制代码
git 目前状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitmodules
new file: themes/pure
复制代码
能够看到, 虽然 themes/pure 是工做目录中的一个子目录, 但 Git 仍是会将它视做一个子模块. 当不在那个目录中时, Git 并不会跟踪它的内容, 而是将它看做该仓库中的一个特殊提交.
主题 clone 好后, 按照主题的说明安装好须要的插件模块, 再执行 hexo s
, 从新打开 http://localhost:4000/ 即可以看到使用新主题的博客页面了.
提交新的 git 记录
$ rm -rf themes/landscape
$ git commit -am 'added pure themes'
create mode 100644 .gitmodules
create mode 160000 themes/pure
复制代码
删除旧的 landscape
主题, 使用 git commit -am
从新提交添加了 pure
主题的 hexo 项目, 能够看到 git 使用 160000 模式建立 themes/pure 记录. 这是 git 中的一种特殊模式, 它本质上意味着将一次提交记做一项目录记录, 而非将它记录成一个子目录或者一个文件.
拉取含子模块的修改
主题做为子模块添加到项目中后, 若主题做者有更新, 即可经过两种方法来拉取主题的更新内容.
themes
下主题目录, 执行 git fetch
和 git merge origin/master
来 merge 上游分支的修改git submodule update --remote
, Git 将会自动进入子模块而后抓取并更新更新后从新提交一遍, 子模块新的跟踪信息便也会记录到仓库中.
拉取含子模块的项目
使用 git clone
命令默认不会拉取项目中的子模块, 在 clone 后的项目中能够经过运行两个命令:
git submodule init
初始化本地配置文件git submodule update
从该项目中抓取全部数据并检出父项目中列出的合适的提交也可在 clone 使用 git clone --recursive
命令, git 就会自动初始化并更新仓库中的每个子模块.
经过子模块基础用法, 能够直接方便的跟踪管理一些的简单的主题. 但不少主题都存在一些本身的配置项目, 须要咱们根据本身的须要来进行设置, 或者咱们想要在主题的基础上自定义修改本身喜欢的主题, 这个时候就须要对主题进行修改并提交仓库以便在各处使用.
不过对于主题仓库咱们通常没有提交的权限, 不能提交到主题源仓库中. 此时能够经过 fork
功能, 在源主题上 fork 出本身项目, 从而在本身仓库中进行提交来跟踪修改.
这里我在 pure 主题上 fork 出了一个本身的主题仓库 my-hexo-theme-pure, 使用这个仓库按照以前的步骤替换本来的主题来做为子模块.
修改子模块
当运行 git submodule update
从子模块仓库中抓取修改时, Git 将会得到这些改动并更新子目录中的文件, 可是会将子仓库留在一个称做 游离的 HEAD
的状态. 这意味着没有本地工做分支(例如 "master")跟踪改动, 此时作的任何改动都不会被跟踪. 所以, 咱们首先须要进入子模块目录而后检出一个分支.
$ git checkout stable
Switched to branch 'stable'
复制代码
若子分支仓库中有未同步的更新, 可经过 git submodule update --remote --rebase
来同步最新的内容. 以后即可以打开编辑器在子模块上工做修改代码了.
同步源主题的修改
主题做者发布了新的主题功能或者修复了Bug, 咱们想同步到本身的自定义主题当中. 由于咱们的自定义主题是从原主题中 fork 出来的, 能够经过 git remote add source https://github.com/cofess/hexo-theme-pure
命令将源主题仓库添加为子模块的 一个新的 source
仓库. 而后运行 git fetch
拉取修改后, 即可以经过 git merge origin/master
来同步源主题的更新了.
发布子模块的修改
子模块修改完成后, 咱们即可以发布到仓库中, 以便在其余地方从新 clone 时可使用最新的主题文件. 为了防止咱们遗忘子模块的提交, 能够在 push 时经过 git push --recurse-submodules=check
命令, 若是任何提交的子模块改动没有推送那么 check 选项会直接使 push 操做失败.
另外也可使用 git push --recurse-submodules=on-demand
git 会自动尝试推送变动的子项目.
以上介绍了使用子模块来管理 themes 的方法, 实际上在 hexo 中还可使用 子模块来管理 hexo 的静态部署文件. 对于使用 github 托管静态页面等部署方式的用户而言, 经过 hexo-deployer-git
插件能够方便的自动化部署静态页面.
hexo-deployer-git 工做流程
hexo-deployer-git
部署的方式是在 hexo 项目根目录下建立了一个 .deploy_git
文件夹, 并在其中建立了一个独立的 git 分支, 将生成静态文件移入这个文件夹中并推送到指定的地址. 但 .deploy_git
文件夹默认也被写入 .gitignore
文件中, hexo 项目 git 库不会记录这个文件夹, 同时 hexo-deployer-git
在每次部署时也不会自动同步服务器上的提交历史, 而是强制覆盖旧的提交. 在新的电脑或路径上从新 clone 后也会出现旧的静态文件记录丢失的状况, 从新 deploy 后服务器上旧的部署历史也会丢失.
若是想要保存每次的部署记录, 那么就能够将 .deploy_git
中的文件也看作一个子项目, 以子项目的形式提交到 hexo 主项目中保存, 就能够保持部署记录不丢失, 而且在任何地方从新 clone 时均可以恢复最新的记录.
添加 .deploy_git 中分支为子项目
.deploy_git
中是由部署插件在 hexo 项目上建立的一个独立分支, 只需经过传递 -b
选项将 hexo 项目的这个分支做为主项目的依赖便可, 例如部署在 coding
时, 使用的 coding-pages
分支:
git submodule add -b coding-pages <site>
复制代码
Pro Git book - 子模块 git-scm.com/book/zh/v2/…