在现有的 Jekyll 安装中切换主题

Switch theme in an existing Jekyll installation

Jekyll 有很多主题,例如https://github.com/jekyll/jekyll/wiki/Themes.

在现有的 Jekyll 安装中切换到新主题的最简单方法是什么?

虽然您可以通过派生新主题迁移到现有安装,然后手动复制和粘贴 CSS、JS、HTML 等资源在 _includes_layouts 和您可能需要的其他文件中,这可能不是一个好主意,因为您最终混合了新旧资源,这些资源可能名称不同,但在它们存在的情况下(例如,您没有覆盖 post 引用的旧样式表),它会导致混合 CSS 样式,您必须调试并慢慢修复.

因为我假设你已经安装了 Git 的 Jekyll(如果你真的不应该),你可以创建一个名为 new-theme 并从 master 切换到该分支作为工作分支。 (如果你不想处理 Git 分支(但实际上,你应该这样做,一个简单的方法就是复制你的整个 Jekyll 安装并将其作为 old-Jekyll-install 粘贴到别处。Here's a tutorial 帮助我学习)

  1. 下载新主题的文件。
  2. 手动复制 _posts 和您的自定义更改。
  3. 通过手动比较它们并移动必要的内容来移植您的_config.yml
  4. 建立网站,看看你遗漏了什么,什么可能搞砸了(例如,在过去,你可能添加了一些 <br \> 标签用于间距,但你不希望在新主题)。
  5. master 合并(或将其投入生产)

话虽这么说,这一切都是相当手动的,而且很痛苦,但至少您不必处理资源冲突。不过,这样做的 缺点 是您的存储库不会与主题存储库同步。所以你不会得到上游更新。我仍然建议您 fork 主题存储库,移植您对 Jekyll 站点的个人定制,然后重命名该存储库以用于生产。 (这当然不再使用 'existing' Jekyll 安装)

有 GH-Pages

tested this,但我是在一个我没有任何想要保存的项目中完成的,并且主题相当简单,所以随着复杂性的增加,这可能不太适用。

  1. 为了安全,新建一个分支

    git checkout -b newtheme
    
  2. 然后将新主题添加为远程

    git remote add new-theme-upstream https://github.com:drjekyllthemes/jekyll-minimal-theme.git
    git pull new-theme-upstream HEAD
    
  3. 混乱的部分,您将遇到一堆合并冲突。检查哪些文件与 git status 有合并冲突,希望这些冲突只出现在您要覆盖的样式文件中。如果有任何文件您想保留,您可以使用文本编辑器编辑它们:git 将标记文件中的更改
  4. 推送到你的源

    git push origin newtheme
    
  5. 转到 github 上的项目页面,您会注意到类似这样的内容:
  6. 创建拉取请求并合并新的更改。
  7. 您的项目仍将显示为第一个主题的分支,您将无法为新主题的上游创建拉取请求。但是您可以使用 git pull new-theme-upstream
  8. 合并新主题的新更新

如果你没有使用 gh-pages 或者如果你在推送到 github 之前在本地构建 jekyll(我认为)

您可以将主题保存在 git 个子模块中,作为单独的文件夹,然后将关键元素符号链接到 jekyll。这个不会gh-pages粗略的例子

中工作
blog
|
+-- theme_1/
|
+-- theme_2/
|  |
|  +-- _layouts/
|
+-- _layouts ln - theme_2/_layouts

这样在更改主题时主题不会发生冲突。

这是我为更改现有 Jekyll 安装的主题所做的。调整这些说明以满足您的需要。

拉新主题

我们创建一个新的孤立分支 newtheme 并确保它是空的。

git checkout --orphan newtheme
git rm -rf .
git clean -dfx

然后我们通过将主题添加为上游远程来将主题文件拉入其中。在此示例中,我拉取了 John Otander 的 Pixyll 主题的 master 分支。

git remote add upstream https://github.com/johnotander/pixyll.git
git fetch upstream
git pull upstream master

构建主题并进行测试。

bundler install
jekyll serve

合并您的更改

现在我们合并我们的帖子、配置等。您可以使用 Git checkout 从您的旧 Jekyll 站点复制文件或文件夹。请注意,这将覆盖主题文件(如果存在)。

git checkout master -- _posts

或者,您可以使用新名称复制文件,例如手动合并它。

git show master:_config.yml > _config.yml.old

如果你不小心覆盖了一个主题文件,你可以恢复它。

git checkout upstream/master -- about.md

这些是我必须复制、合并、调整或删除的文件:

  • 根文件夹中的 Markdown 文件。
  • _posts 文件夹中的帖子。
  • _drafts 文件夹中的草稿。
  • _config.yml 配置文件。
  • Gemfile gem 文件。
  • CNAME 文件(用于 Git 中心页面)。
  • Rakefile(如果有的话)。
  • 网站图标文件(如果有)。
  • 手动更改主题,例如 Google Analytics、Disqus、SEO 字段(如果有)。

提交您的更改,不要忘记再次测试主题。

替换master分支

最后,我们将现有的 master 分支替换为新的 newtheme 分支。假设我们在 newtheme 分支上:

git checkout newtheme
git merge -s ours master
git checkout master
git merge newtheme

推送更改。

git push

并清理本地 newtheme 分支。

git branch -d newtheme

就是这样!您已成功更换主题。如果有什么我遗漏的,或者你有什么要补充的,请发表评论。


正在更新主题

如果您以后想更新主题以包含最新的上游更改,只需:

git pull upstream master

并修复所有合并冲突。这里我假设 upstream 遥控器仍然设置为主题的存储库(您可以使用 git remote -v 检查)。

Jekyll v3.2 introduced gem-based themes (for future plans see here):

Gem-based themes make it easy for theme developers to make updates available to anyone who has the theme gem. When there’s an update, theme developers push the update to RubyGems

The goal of gem-based themes is to allow you to get all the benefits of a robust, continually updated theme without having all the theme’s files getting in your way and over-complicating what might be your primary focus: creating content.

安装基于 gem 的主题很简单:

  1. 将主题添加到您网站的 Gemfile:gem "jekyll-theme-awesome"
  2. 安装主题:bundle install
  3. 将以下内容添加到您站点的 _config.yml 以激活主题:theme: jekyll-theme-awesome
  4. 建立您的网站:bundle exec jekyll serve

要切换主题,我相信这样的事情应该可行:

  1. 更改为您站点的 Gemfile 中的新主题:gem "jekyll-theme-new"
  2. 安装主题:bundle install
  3. 更改您站点的 _config.yml 以引用新主题:theme: jekyll-theme-new
  4. 建立您的网站:bundle exec jekyll serve
  5. (可选 - 从您的机器上卸载旧主题)记下旧主题的安装文件夹 (bundle show jekyll-theme-awesome) 并使用 gem uninstall jekyll-theme-awesome 卸载它。为了安全起见,请确保其文件夹确实已被删除。

更新基于 gem 的主题很容易:

If you have the theme gem, you can (if you desire) run bundle update to update all gems in your project. Or you can run bundle update <THEME>, replacing with the theme name, such as minima, to just update the theme gem. Any new files or updates the theme developer has made (such as to stylesheets or includes) will be pulled into your project automatically.

重要说明:在撰写本文时,GitHub 页面仅支持 specific set of gem-based themes: Architect, Cayman, Dinky, Hacker, Leap day, Merlot, Midnight, Minima, Minimal, Modernist, Slate, Tactile, and Time machine. Of those, it seems only Minima is blog-oriented (e.g. it's the only one with built-in Disqus support). However, you should be able to use any theme if you are willing to run the Jekyll build process yourself

另一种选择是 GitLab pages (tutorial, sample site).

在现有或新安装的 jekyll 中切换主题的最简单方法是使用以下插件:jekyll-remote-theme,自 2017 年 11 月起可用。

虽然它目前处于测试阶段,但它运行良好,最重要的是它已经在 Github 页面上列入白名单,因此无需在本地构建,除非请求的主题包含不受支持的 Gem。

因此,对于包含页面和博客的简单网站,您可以直接在 Github 基础架构上托管和编辑您的内容,并通过输入新网站的地址来切换您的网站主题遥远的主题。一个额外的好处是,您可以先使用 several existing themes 测试您的内容,然后再提交其中一个内容。

除了更容易切换之外,jekyll-remote-theme 方法应该会自动引入新版本的远程主题,只要你做出改变,那里是主题维护者的新版本。如果主题的维护者做出了您不喜欢的根本性更改,那么您总是需要敲几下键盘才能获得新主题。

我安装了几个 jekyll,我已经在使用它,短期内不打算切换,因为它是目前最优雅和面向未来的解决方案。

如果您现有的 jekyll 安装是纯的(即,您只编辑了页面、帖子、配置),那么切换是无缝的。如果您现有的主题具有特殊布局(例如, , splash.html 而新的没有它)然后你的页面使用相应的布局成为孤儿(即没有特殊格式的基本 html)。我已经切换了一个已经被广泛编辑的现有安装,所以我得到了几个孤立的页面,但我没有得到任何 git 合并冲突,这些冲突可能与这里讨论的其他方法有关。