私は数人のプロジェクトを抱えており、GitHubページにレンダリングされた一連のGitHubフレーバーマークダウンを含むREADME.md
ファイルがあります。また、GitHub組織のサブドメインでホストされるGitHub Pagesブランチをセットアップし、 Automatic Page Generator を使用して、単純にREADME.md
ファイルをロードしました。私たちのページを作成しました。ただし、README.md
ファイルを更新しても、プロジェクトページは更新されないことに気付きました。代わりに、GitHub設定タブに移動してプロジェクトページを再作成し、README.md
ファイルをリロードする必要があります。
また、 相対リンク について読んだ後、GitHubプロジェクトディレクトリページのドキュメントファイル間で動作します。ドキュメンテーションのためにすべてのHTMLを手作業で書き出す必要がないので、時間を大幅に節約できるので、私はマークダウンがとても気に入っています。ただし、README.md
にある他のドキュメントファイルへの相対リンクを含めることができるdocs/*.md
ファイルを1つ作成できるようにしたいのですが。他のドキュメントファイルもgh-pagesブランチに含まれ、GitHub Pagesサブドメインの下でホストされ、レンダリングまたはテーマ化されるように、簡単な解決策があることを望んでいました。
つまり、私の質問は次のとおりです。
/docs/*.md
をGithubページに何らかの方法で同期し、何とかそれらをレンダリングまたはテーマ設定しますか?GitHub Pagesが自動ページジェネレーターをすでに使用しているJekyllを使用しているという事実を利用して設定したソリューションを投稿します。
git checkout gh-pages
mkdir _layouts
mv index.html _layouts
git checkout master -- README.md
mv README.md index.md
index.md
の前に追加します---
layout: index
---
また、index.html
ファイルを開き、次の変更を行う必要があります。
レンダリングされたHTMLをREADME.md
ファイルのマークダウンから削除します。これは通常、<section>
または<article>
タグの間にあります。このHTMLをテキスト{{ content }}
に置き換えます。これにより、このファイルをjekyllとして使用できます。レイアウトを適用するファイルは、コンテンツタグがある場所に配置されます。
プロジェクトページのテーマのCSSを見つけます。私にとってこれは次のような行でした:
<link rel='stylesheet' href='stylesheets/stylesheet.css' />
これを次のように変更する必要があります
<link rel='stylesheet' href='{{ site.path }}/stylesheets/stylesheet.css' />
{{ site.path }}
をプレフィックスとして付ける必要があります。これにより、Jekyllはマークダウンファイルをindex.html
ディレクトリの_layouts
レイアウトのコンテンツとしてレンダリングします。 README.mdファイルだけでなく、masterブランチにある他のドキュメントについてもこのプロセスを自動化するために、次の手順を実行しました。
以下を含むpost-commit
というファイルを作成しました。
#!/bin/bash
###
### The following block runs after commit to "master" branch
###
if [ `git rev-parse --abbrev-ref HEAD` == "master" ]; then
# Layout prefix is prepended to each markdown file synced
###################################################################
LAYOUT_PREFIX='---\r\nlayout: index\r\n---\r\n\r\n'
# Switch to gh-pages branch to sync it with master
###################################################################
git checkout gh-pages
# Sync the README.md in master to index.md adding jekyll header
###################################################################
git checkout master -- README.md
echo -e $LAYOUT_PREFIX > index.md
cat README.md >> index.md
rm README.md
git add index.md
git commit -a -m "Sync README.md in master branch to index.md in gh-pages"
# Sync the markdown files in the docs/* directory
###################################################################
git checkout master -- docs
FILES=docs/*
for file in $FILES
do
echo -e $LAYOUT_PREFIX | cat - "$file" > temp && mv temp "$file"
done
git add docs
git commit -a -m "Sync docs from master branch to docs gh-pages directory"
# Uncomment the following Push if you want to auto Push to
# the gh-pages branch whenever you commit to master locally.
# This is a little extreme. Use with care!
###################################################################
# git Push Origin gh-pages
# Finally, switch back to the master branch and exit block
git checkout master
fi
EDIT:README.md
ファイルとdocs/*
のマークダウンの両方について上記のスクリプトを更新して、両方が同じレイアウトファイルを使用するようにしました。これは私が以前に持っていたものよりもはるかに良い設定です。このスクリプトは.git/hooks/
ディレクトリにあります。 bashはパスに含まれている必要があります。
ファイル_config.yml
を次のように作成します
markdown: redcarpet
path: http://username.github.io/reponame
上記のスクリプトは、master
ブランチのdocs/*
ディレクトリにあるマークダウンファイルも同期して、GitHub Pagesサイトでも表示できるようにします。これらのドキュメントへの相対リンクは、.md
ブランチのアンカーからgh-pages
拡張を取り除くために次のjQuery関数を含める場合に機能します。次のスクリプトをindex.html
ディレクトリの_layouts
に追加できます。
$(document).on('ready', function () {
$('a').each(function (i, e) {
var href = e.href;
if (href.search('.md') > 0)
$(this).attr('href', href.split('.md')[0]);
});
});
編集:私は私のリポジトリで上記のコードを変更しました、これはこれを行うための迅速で汚い方法でしたが、すべてのケースで正しく機能しません私が何を言っているのかわかっているなら。たとえば、マークダウンファイルcompany.mdata.md
は正しく処理されません。これを修正するために、これを次のスクリプトに更新しました。このスクリプトは、hrefをより注意深くチェックし、見つかった場合は拡張機能を削除します。また、スクリプトをより汎用的なものにして、ext
変数を変更することで他の拡張機能を削除できるようにしました。これがコードです:
$(function () {
$('a').each(function () {
var ext = '.md';
var href = $(this).attr('href');
var position = href.length - ext.length;
if (href.substring(position) === ext)
$(this).attr('href', href.substring(0, position));
});
});
CoryG89/docsync にサンプルのリポジトリをセットアップします。これには プロジェクトページはここにあります 、これがどのように連携するかを確認したい場合。
READMEをGithubページと同期する問題に対する私の解決策は、上記とは少し異なります。別のJavaScript Markdownエンジンを使用する代わりに、Github APIを使用して、次のようにレンダリングされたMarkdownファイルを返すことができます。 HTML。
README.md
_から_https://api.github.com/repos/<owner>/<repo>/contents/README.md
_をフェッチします。window.atob( JSON.parse( blob ).content );
デコードされたREADME
をJSON本文で_https://api.github.com/markdown
_に投稿する
_ {
"text": "<README>",
"mode": "markdown",
"context": "<owner>/<repo>"
}
_
Brad Rhodes のように、レンダリングされたHTMLをDOM要素に挿入します。
このアプローチには2つの注意点があります。
読み込み時間が重要ではない(約1〜2秒)トラフィックの少ないページでは、上記の方法で十分に機能します。
DocumentUp を使用して、README.mdをレンダリングできます。
ドキュメントサイトとメインのgithubリポジトリ間で単一のreadmeファイルを共有するためのアイデアがいくつかあります。
コードとjekyllドキュメンテーションサイトの両方を含む単一のgh-pagesブランチのみを使用できます。リポジトリが少し乱雑になる可能性があるため、Readmeの上部にYAMLヘッダーを配置する必要があります。それalmostは相対リンクをサポートします。問題は、jekyllでマークダウンをレンダリングしたい場合に.html拡張子を付けることです。多分これを設定する方法があります。 これが動作するかどうか確認するために一緒に投げた例です
ドキュメントサイトでAJAX呼び出しを使用してメインブランチからreadmeを読み取り、 Javascript Markdownレンダラー でレンダリングすることができます。これにはロードに少し時間がかかりますまた、巧妙なJavascriptを書かないと、相対リンクはサポートされません。また、アイデア1よりも実装が面倒です。
考慮すべき別のルートは、関連ページを構築する pre-commitフック を設定することです。 私のリポジトリの1つ でこれを行います。おそらく、自動ページジェネレーターを破棄し、gh-pages
ブランチに自分でプッシュするだけでなく、ドキュメントをHTMLまたはJekyllサイトに変換するために特別なことを行う必要があります Nathanの提案 。
そのリポジトリでは I Push this thisgh-pages
をmaster
と同一に保つため。それを行うには 他の方法 もたくさんあります。ただし、これは状況によっては理想的ではない場合があります(これらを同一にしたくない場合があります)。
とにかく、私がこの質問に賞金を提供した理由は、誰かがより良いワークフローを持っていることを望んでいたからです。この方法は、複雑で柔軟性に欠けるため、フックを同期させる必要があります。
NathanとBrand Rhodesによって説明された方法の別の可能性は、素晴らしいツールを使用することです: FlatDoc Rico Staによって作成されました。クルス。
FlatDocはajaxによってドキュメント(README.mdまたはその他のマークダウンファイル)をロードし、それを解析して、すべての便利な機能とナビゲーション用のサイドバーメニューを表示します。
Apiには、GitHubレポマスターからファイルを読み込むヘルパーメソッドが組み込まれています(ただし、Webから他の場所に読み込むこともできます)。
指示
まず、次の htmlテンプレート をgh-pagesブランチのindex.htmlにコピーします。続ける:
ファイル内。ブラウザでローカルに試してください。次に、変更をコミットしてプッシュします。これで、githubページは常にmasterブランチのREADME.mdファイルで更新されます。
デフォルトのテーマで満足できない場合は、独自のCSSでスタイルを変更できます。
私がかなりうまく機能するようになったもう1つの方法は、Ajaxを使用して、Github APIとJavascriptマークダウンエンジンを使用してドキュメントをフェッチし、HTMLをレンダリングすることです(これもNathanによって提案されています)。
ネイサンはパフォーマンスについて懸念を表明しましたが、私の経験では、それは一見一瞬でロードされるため、実際には問題ではないと思います。
利点は、セットアップが簡単で、githubのブラウザーでマークダウンを直接編集した場合でも、常にドキュメントが更新されることです。
http://bradrhodes.github.io/GithubDocSync/ のGithubページに例を設定して、動作することを示しています。
また、マスターでドキュメントを編集してgh-pagesで公開したいのですが、ソースコードを使用してドキュメントを最新の状態に保ち、それが最善の方法のようです。これは私にとって進行中の作業ですが、私は Cory's script を出発点として少し拡張し、__layouts
_(つまり、jekyllサイト)。 githubソースブラウジングではうまく機能するが、ghページでは機能しないバックティックスタイルのフェンシング(コードブロック用)を変換します。プロジェクトに_index.md
_をインクルードして_README.md
_を使用するので、ヘッダーやその他の装飾を追加できます。このバージョンは、複数のモジュール(gitサブモジュールではなく、サブディレクトリのみ)を含むプロジェクトで便利な「docs」というネストされたディレクトリ内のドキュメントも処理します。
_.git/hooks/post-commit
_
_#!/bin/bash
###
### The following block runs after commit to "master" branch
###
if [ `git rev-parse --abbrev-ref HEAD` == "master" ]; then
# function to convert a plain .md file to one that renders nicely in gh-pages
function convert {
# sed - convert links with *.md to *.html (assumed relative links in local pages)
# awk - convert backtick fencing to highlights (script from bottom of file)
sed -e 's/(\(.*\)\.md)/(\1.html)/g' "$1" | awk -f <(sed -e '0,/^#!.*awk/d' $0) > _temp && mv _temp "$1"
}
if ! git show-ref --verify --quiet refs/heads/gh-pages; then
echo "No gh-pages, so not syncing"
exit 0
fi
# Switch to gh-pages branch to sync it with master
###################################################################
git checkout gh-pages
mkdir -p _includes
# Sync the README.md in master to index.md adding jekyll header
###################################################################
git checkout master -- README.md
if [ -f README.md ]; then
cp README.md _includes/
convert _includes/README.md
git add README.md
git add _includes/README.md
fi
# Generate index if there isn't one already
###################################################################
if [ ! -f index.md ]; then
echo -e '---\ntitle: Docs\nlayout: default\n---\n\n{% include README.md %}' > index.md
git add index.md
fi
# Generate a header if there isn't one already
###################################################################
if [ ! -f _includes/header.txt ]; then
echo -e '---\ntitle: Docs\nlayout: default\nhome: \n---\n\n' > _includes/header.txt
git add _includes/header.txt
fi
# Sync the markdown files in all docs/* directories
###################################################################
for file in `git ls-tree -r --name-only master | grep 'docs/.*\.md'`
do
git checkout master -- "$file"
dir=`echo ${file%/*} | sed -e "s,[^/]*,..,g"`
cat _includes/header.txt | sed -e "s,^home: .*$,home: ${dir}/," > _temp
cat "$file" >> _temp && mv _temp "$file"
convert "$file"
git add "$file"
done
git commit -a -m "Sync docs from master branch to docs gh-pages directory"
# Uncomment the following Push if you want to auto Push to
# the gh-pages branch whenever you commit to master locally.
# This is a little extreme. Use with care!
###################################################################
# git Push Origin gh-pages
# Finally, switch back to the master branch and exit block
git checkout master
fi
exit $?
#!/usr/bin/awk
{
# Replace backtick fencing (renders well when browsing github) with jekyll directives
if (/```/) {
IN = IN?0:1 # Are we already in a fenced section? Toggle.
if (IN) { # If we are starting a fenced section
if (/```\s*$/) {
$0 = $0"text" # empty language is OK for backticks but not for jekyll
}
gsub(/```/, "{% highlight ")
print $0" %}"
} else { # ending a fenced section
print "{% endhighlight %}"
}
} else { # not a fencing line
if (IN) { # but in a fenced section, so add indent to make sure code is rendered with <pre>
print " "$0
} else {
print
}
}
}
_
オリジナルからのもう1つのバリエーションは、すべてのページで変数_page.home
_を設定することです。これは、ルートディクトリカルの相対パスを見つけるために使用できるため、CSSなどの静的リソースを見つけるために使用できます。 __layouts/.default.html
_では、
_<link rel="stylesheet" href="{{ page.home }}css/main.css">
_
このようにして、CSSを編集してjekyllサイトをローカルで構築し、githubがサーバーで構築するのを待たずにブラウザーで結果を確認できます。
難しくはありません、2つのコピーとターミナルへの貼り付けが完了しました。
Jekyll
を使用すると、マークダウンファイルをインポートして、HTMLに変換することができます。コツは、README.md
をindex.md
を使用して{% include_relative README.md %}
ファイルにインポートすることです。以下にその方法を示します。
チェックアウトする価値があります GithubでスーパーベアボーンJekyll
サイトをセットアップする方法 (それは2つのファイルです! )
これを実行するだけで、2つのファイルをコピーして現在のreadmeでページを処理できますワンタイムセットアップ(コピーコードブロック全体をターミナルに挿入します):
# Copy our two files to the gh-pages branch
git checkout -b gh-pages &&
wget https://raw.githubusercontent.com/lazamar/barebones-jekyll-project-readme/master/_config.yml &&
wget https://raw.githubusercontent.com/lazamar/barebones-jekyll-project-readme/master/index.md &&
#
# Commit and publish our page on github
git add -A && git commit -m "Create project github page" &&
git Push --set-upstream Origin gh-pages |
#
git checkout master # go back to master branch
次に、すべてのプッシュの前に、master
からgh-pages
ブランチにすべての変更をコピーするタスクを自動化する必要があります。これを実行するには、このスクリプトを実行します(コピーしてターミナルに貼り付けます)
$(cat > .git/hooks/pre-Push << EOF
#!/bin/sh
we_are_in_gh_pages="\$(git branch | grep -G "* gh-pages")"
if [ ! "\$we_are_in_gh_pages" ];
then
git checkout gh-pages &&
git rebase master &&
git Push -f &&
git checkout master # go back to master branch
fi
EOF
) && chmod 775 .git/hooks/pre-Push
gh-pages
を実行するたびに、master
ブランチからgit Push
にすべての変更をコピーするプッシュフックが作成されます。
以上です。完了しました。
私は最近、この問題を解決するためにパッケージ gh-pages-generator を作成しました-複数のMDファイルと設定ファイルを使用してマルチページサイトを生成します。
ページ間のすべてのリンクを正しく更新します。変更をgh-pagesブランチにコミットすることをCIの一部にすることは比較的簡単です。