ドキュメントをGithubPagesと同期するにはどうすればよいですか?


81

私は何人かの人々と一緒にプロジェクトを持っており、README.mdGitHubページにレンダリングされたGitHubフレーバーマークダウンの束を含むファイルがあります。また、GitHubOrganizationのサブドメインでホストされるGitHubPagesブランチを設定し、ページの作成時にファイルにロードするだけの自動ページジェネレーターを使用しましたREADME.md。ただし、README.mdファイルを更新してもプロジェクトページが更新されないことに気付きました。代わりに、[GitHub設定]タブに移動してプロジェクトページを再作成し、README.md実行時にファイルを再読み込みする必要があります。

また、GitHubプロジェクトディレクトリページのドキュメントファイル間で機能する相対リンクについて読んだ後。ドキュメントのためにすべてのHTMLを手作業で書き出す必要がないため、マークダウンが非常に気に入っています。ただしREADME.md、にある他のドキュメントファイルへの相対リンクを含めることができる1つのファイルを作成できるようにしたいと思いますdocs/*.md。他のドキュメントファイルもgh-pagesブランチに含まれ、GitHub Pagesサブドメインでホストされ、レンダリングやテーマが設定されるように、簡単な解決策があることを望んでいました。

言い換えれば、私の質問は次のとおりです。

  • Github PageサブドメインでREADME.mdファイルを自動的に更新する方法はありますか?
    • [編集]:自動ページジェネレータを使用している場合、答えはないようです。リポジトリを更新するには、リポジトリの設定ページに移動し、変更があるたびにリポジトリを再読み込みする必要があります。
       
  • README.mdファイルのドキュメントへの相対リンクをGithubPagesで機能させる/docs/*.md方法はありますか?おそらく、Github Pagesに同期し、レンダリングやテーマ設定を行う方法はありますか?
  • さらに良いことに、これを行うためのさらに簡単な方法があり、おそらくgh-pagesとメインブランチの両方で使用され、すべてを簡単にするREADME.mdとドキュメントのコピーを1つだけ持っていますか?
    • [編集]:これはほぼ間違いなくノーのようです。これを可能にするためにGitHubに何かが組み込まれている可能性について考えていました。この種のサポートは、将来GitHub Pagesに組み込まれる可能性があるようです。少なくとも、そうなることを願っています。
       

3
GitHubは、受信後のWebhookをサポートしています。新しいREADME.mdバージョンをGitHubページにプッシュするリモートスクリプトを呼び出すフックを追加することを考えましたか?
ubik 2013

7
素晴らしく、調査結果を編集していただきありがとうございます。このサイトでは十分な人がそれをしていません。
Matt Kantor 2013年

最初の質問については、これは自動ではなく手動のアプローチですが、シンプルで機能します。HTML生成部分には、dillinger.ioを使用できます。この自動メソッドも見つけましたが、試してみましたが、機能しませんでした。
2016

回答:


37

GitHubPagesがすでに自動ページジェネレーターを使用しているJekyllを使用しているという事実を利用してセットアップしたソリューションを投稿します。

  1. git checkout gh-pages
  2. mkdir _layouts
  3. mv index.html _layouts
  4. git checkout master -- README.md
  5. mv README.md index.md
  6. 次のテキストをに追加します index.md

 

---
layout: index
---

また、index.htmlファイルを開いて次の変更を加える必要があります。

  1. レンダリングされたHTMLをREADME.mdファイルのマークダウンから削除します。これは通常、<section>または<article>タグの間にあります。このHTMLをテキストに置き換えると、{{ content }}このファイルをジェキルとして使用できるようになります。レイアウトを適用するファイルは、コンテンツタグがある場所に配置されます。

  2. プロジェクトページテーマのCSSを見つけます。私にとって、これは次のような行でした。

    <link rel='stylesheet' href='stylesheets/stylesheet.css' />

    これをに変更する必要があります

    <link rel='stylesheet' href='{{ site.path }}/stylesheets/stylesheet.css' />

  3. このレイアウトで使用されるサイトに保存されているその他のアセットにも、プレフィックスを付ける必要があります{{ site.path }}

これを行うことにより、Jekyllはマークダウンファイルをindex.htmlレイアウトのコンテンツとしてレンダリングします。_layoutsディレクトリ。README.mdファイルだけでなく、マスターブランチにある他のドキュメントについてもこのプロセスを自動化するために、次の手順を実行しました。

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

編集:README.mdファイルとマークダウンの両方について上記のスクリプトを更新して、docs/*両方が同じレイアウトファイルを使用するようにしました。これは、以前よりもはるかに優れたセットアップです。このスクリプトは.git/hooks/ディレクトリに配置されます。bashはあなたの道になければなりません。

_config.yml次のファイルを作成します

markdown: redcarpet
path: http://username.github.io/reponame

上記のスクリプトは、GitHub Pagesサイトでも表示できるようdocs/*に、masterブランチのディレクトリにあるマークダウンファイルも同期します。これらのドキュメントへの相対リンク.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にサンプルリポジトリを設定します。


4
私はあなたにそのような徹底的な答えを与えるための私の報奨金を授与していますが、それでも誰かがもっと簡単な解決策を考え出すことを願っています。
Matt Kantor 2013年

1
マットに感謝します。私は先に進み、これを行うための別のより簡単で単純な解決策を期待して、50人の担当者を使用して別の報奨金を設定します。このソリューションは、READMEと、サイトおよびリポジトリ内の他のマークダウンドキュメントとの間で、相対リンクが期待どおりに機能し続けることを可能にするため、優れています。
Cory Gross

1
コミット後のフックで.md拡張子を削除する方が簡単ではないでしょうか。それとも、Jenkins自体を使用してそれを行う方法さえありますか?
jjmerelo 2013年

ファイルを.md拡張子の付いたストレージに保存する必要があると思います。そうしないと、Markdownとしてレンダリングされません。しかし、100%ではありません。
Cory Gross 2013年

2
2016年にはもっとシンプルなものがありますか?
ピータークラウス

5

READMEをGithubページと同期する問題に対する私の解決策は、上記とは少し異なります。別のJavaScriptMarkdownエンジンを使用する代わりに、GithubAPIを使用してHTMLとしてレンダリングされたMarkdownファイルを返すことができます。

  1. README.mdからフェッチしhttps://api.github.com/repos/<owner>/<repo>/contents/README.mdます。
  2. Base64応答をデコードします。 window.atob( JSON.parse( blob ).content );
  3. デコードREADMEhttps://api.github.com/markdownれたをJSON本文に投稿する

     {
       "text": "<README>",
       "mode": "markdown",
       "context": "<owner>/<repo>"
     }
    
  4. Brad Rhodesが行ったように、レンダリングされたHTMLをDOM要素に挿入します。

このアプローチに対する2つの注意点:

  1. 2つのシリアル要求を実行すると、ページの読み込みが遅くなります。
  2. GithubAPIにアクセスするときにレート制限が発生する可能性があります。

ロード時間が重要ではない(約1〜2秒)トラフィックの少ないページの場合、上記の方法で十分に機能します。


atob()はChromeとFFでは正常に機能しますが、IE11では機能しません。無効な文字を言います。サイトはjoymon.github.io/joyful-visualstudioの
Joy George Kunjikkuru 2015年


3

ドキュメントサイトとメインのgithubリポジトリ間で単一のreadmeファイルを共有するためのアイデアがいくつかあります。

  1. コードとjekyllドキュメントサイトの両方を含む単一のgh-pagesブランチのみを使用できます。リポジトリが少し乱雑になる可能性があるため、Readmeの先頭にYAMLヘッダーを配置する必要があります。これは、ほとんどの相対リンクをサポートしています。問題は、jekyllにマークダウンをレンダリングさせたい場合、.html拡張子を付けることです。たぶんこれを設定する方法があります。これは、それが機能するかどうかを確認するために一緒に投げた例です。

  2. ドキュメントサイトでAJAX呼び出しを使用して、メインブランチからreadmeを読み取り、JavascriptMarkdownレンダラーでレンダリングすることができます。これはロードに少し時間がかかり、巧妙なJavascriptを記述しないと相対リンクをサポートしません。また、アイデア1よりも実装する作業が多くなります。


3

考慮すべきもう1つのルートは、関連するページを作成するpre-commitフックを設定することです。私は自分のリポジトリの1つでこれを行います。おそらく、自動ページジェネレーターを捨てて、gh-pages自分でブランチにプッシュする必要があります。また、ドキュメントをHTMLまたはJekyllサイトに変換するために何か凝ったことをする必要があります。。またネイサンが提案

そのリポジトリでgh-pagesと同じになるようにこのようにプッシュしますmaster。たくさんありますそれを行う方法他にます。ただし、これは状況にとって理想的ではない場合があります(同一にしたくない場合があります)。

とにかく、私がこの質問に報奨金を提供した理由は、誰かがより良いワークフローを持っていることを望んでいたからです。この方法は複雑で柔軟性がなく、フックの同期を維持する必要があります。


2

私がかなりうまく機能するようになったもう1つの方法は、Ajaxを使用してGithub APIとJavascriptマークダウンエンジンを使用してドキュメントをフェッチし、HTMLをレンダリングすることです(Nathanも提案しています)。

  1. Github APIとJSONPを使用して、Githubからドキュメントをフェッチします
  2. GithubAPIからの応答でbase64コンテンツをデコードします
  3. javascriptマークダウンエンジンを使用してマークダウンをレンダリングします
  4. レンダリングされたhtmlを表示します

ネイサンはパフォーマンスについて懸念を表明しましたが、私の経験では、ロードは一見瞬時に行われるように見えるので、実際には問題ではないと思います。

利点は、セットアップが簡単で、githubのブラウザーでマークダウンを直接編集した場合でも、常にドキュメントが更新されることです。

http://bradrhodes.github.io/GithubDocSync/のGithubページに例を設定して、動作することを示しました。



2

NathanとBrandRhodesによって説明された方法の別の可能性は、RicoStaによって作成されたFlatDocという優れたツールを使用することです。クルス。

FlatDocは、ドキュメント(README.mdまたはその他のマークダウンファイル)をajaxでロードし、解析して、すべての機能とナビゲーション用のサイドバーメニューを表示します。

APIには、GitHubリポジトリマスターからファイルをロードするためのヘルパーメソッドが組み込まれています(ただし、Webから他の場所にロードすることもできます)。

指示

次のhtmlテンプレートをgh-pagesブランチのindex.htmlにコピーすることから始めます。を続行:

  • 「USER」をGitHubユーザー名に置き換える
  • 「REPO」をGitHubリポジトリ名に置き換える
  • 「あなたのプロジェクト」をあなたのプロジェクト名に置き換える

ファイル内。ブラウザでローカルに試してみてください。次に、変更をコミットしてプッシュします。これで、githubページは常にマスターブランチのREADME.mdファイルで更新されます。

デフォルトのテーマが満足のいくものでない場合は、独自のcssでスタイルを変更できます。


1

また、マスターでドキュメントを編集し、gh-pagesで公開したいと思います-ソースコードでドキュメントを最新の状態に保つのが好きで、それが最善の方法のようです。これは私にとっては進行中の作業ですが、Coryのスクリプトを出発点として、gh-pagesブランチ_layouts(つまり、jekyllサイト)がある限り、すぐに機能するように少し拡張しました。githubソースブラウジングではうまく機能するが、ghページではうまく機能しないバックティックスタイルのフェンシング(コードブロック用)を変換します。index.mdプロジェクトにインクルード付きのを使用して、README.mdヘッダーやその他の装飾を追加できるようにします。このバージョンは、「docs」と呼ばれるネストされたディレクトリ内のドキュメントも処理します。これは、複数のモジュール(gitサブモジュールではなく、サブディレクトリのみ)を持つプロジェクトで役立ちます。

.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すべてのページに変数を設定することです。これは、ルートdiractoryの相対パスを見つけるために使用できるため、cssなどの静的リソースを見つけるために使用できます。で_layouts/.default.html、私があります。

<link rel="stylesheet" href="{{ page.home }}css/main.css">

このようにして、cssを編集し、ローカルでjekyllサイトを構築し、githubがサーバー上に構築するのを待たずにブラウザーで結果を確認できます。


0

最近、パッケージgh-pages-generatorを作成しましたこの問題を解決するためにを作成しました。これは、複数のMDファイルと構成ファイルを使用して複数ページのサイトを生成します。

ページ間のすべてのリンクを正しく更新します。変更をgh-pagesブランチにコミットすることをCIの一部にするのは比較的簡単です。

私はここここでそれを使用してます


0

それは厳しくない。2つのコピーを端末に貼り付ければ、準備は完了です。

Jekyllマークダウンファイルをインポートすることができ、それからそれらをHTMLに変換します。秘訣は、を使用README.mdしてindex.mdファイルにインポートすることです。{% include_relative README.md %}。これを行う方法は次のとおりです。

githubでスーパーベアボーンJekyllサイトをセットアップする方法を確認する価値がありますファイルは2つだけです!

セットアップ

この1回限りのセットアップを実行するだけで、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

自動化

次にmastergh-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

masterブランチからgh-pages実行するたびにすべての変更をコピーするプッシュフックが作成されますgit push

それでおしまい。完了。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.