81

私は複数の人と一緒にプロジェクトを行っておりREADME.md、GitHub ページでレンダリングされる GitHub Flavored Markdown の束を含むファイルを持っています。また、GitHub Organization のサブドメインでホストされる GitHub Pages ブランチをセットアップし、自動ページ ジェネレーターREADME.mdを使用して、ページを作成したときにファイルにロードするだけでした。しかし、README.mdファイルを更新してもプロジェクト ページが更新されないことに気付きました。代わりに、GitHub 設定タブに移動してプロジェクト ページを再作成し、そのREADME.md際にファイルをリロードする必要があります。

また、 GitHub プロジェクト ディレクトリ ページのドキュメント ファイル間で動作する相対リンクについて読んだ後。ドキュメント用にすべての HTML を手作業で書き出さなければならない時間を大幅に節約できるので、マークダウンがとても気に入っています。しかし、私が望むのはREADME.mddocs/*.md. 私の他のドキュメント ファイルも私の gh-pages ブランチに含まれ、私の GitHub Pages サブドメインでホストされ、レンダリングおよび/またはテーマ化されるように、簡単な解決策があることを望んでいました。

つまり、私の質問は次のとおりです。

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

10 に答える 10

37

GitHub Pages がすでに Automatic Page Generator を使用している 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 }}このファイルを jekyll として使用できるようにします。レイアウトを適用するファイルは 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

上記のスクリプトdocs/*は、ブランチのディレクトリにあるマークダウン ファイルも同期しmaster、GitHub Pages サイトでも表示できるようにします。これらのドキュメントへの相対リンクは、ブランチ.mdのアンカーから拡張子を削除するために次の jQuery 関数を含めると機能します。次のスクリプトをディレクトリにgh-pages追加できます。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にサンプル リポジトリをセットアップしました。プロジェクト ページはこちらにあります。

于 2013-05-05T22:13:51.707 に答える
6

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

  1. から を取得README.mdhttps://api.github.com/repos/<owner>/<repo>/contents/README.mdます。
  2. Base64 レスポンスをデコードします。window.atob( JSON.parse( blob ).content );
  3. デコードREADMEしたものhttps://api.github.com/markdownを JSON 本文に投稿する

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

このアプローチには 2 つの注意事項があります。

  1. 2 つのシリアル リクエストを実行すると、ページの読み込みが遅くなります。
  2. Github API へのアクセス時にレート制限が発生する場合があります。

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

于 2014-09-12T19:17:28.740 に答える
3

考慮すべきもう 1 つの方法は、関連するページを構築するpre-commit フックを設定することです。これは自分のリポジトリの 1 つで行います。おそらく、自動ページ ジェネレーターを捨てて、自分でブランチにプッシュするだけでなく、 Nathan が提案gh-pagesするように、ドキュメントを HTML または Jekyll サイトに変換するために何か凝ったことをしなければならないでしょう。

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

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

于 2013-05-02T05:29:06.263 に答える
2

Nathan と Brand Rhodes によって説明された方法のもう 1 つの可能性は、Rico Sta によって作成された優れたツール、 FlatDocを使用することです。クルーズ。

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

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

指示

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

  • 「USER」を GitHub ユーザー名に置き換えます
  • 「REPO」を GitHub リポジトリ名に置き換えます
  • 「Your Project」をプロジェクト名に置き換えます

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

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

于 2015-02-25T15:52:45.463 に答える
1

また、マスターでドキュメントを編集し、gh-pages で公開したいと考えています。ドキュメントをソース コードで最新の状態に保つのが好きで、それが最善の方法のようです。これは私にとっては進行中の作業ですが、Cory のスクリプト_layoutsを出発点として、gh-pages ブランチ(つまり 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
      }
    }
}

オリジナルからの別のバリエーションは、page.homeすべてのページに変数を設定することです。これは、ルート ディレクトリの相対パスを特定するために使用できるため、css などの静的リソースを特定するために使用できます。_layouts/.default.html私は持っています:

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

そうすれば、css を編集し、ローカルで jekyll サイトをビルドし、サーバー上で github がビルドするのを待たずにブラウザで結果を確認できます。

于 2013-07-12T10:59:15.853 に答える
0

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

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

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

于 2016-08-09T22:34:47.850 に答える
0

難しいことではありません。ターミナルに 2 回コピー アンド ペーストするだけで、すべての設定が完了します。

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

githubでスーパー ベアボーンJekyllサイトをセットアップする方法を確認する価値があります(たった2 つのファイルです! ) 。

セットアップ

この 2 つのファイルをコピーして、この1 回限りのセットアップを実行するだけで、現在の 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

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

それでおしまい。終わり。

于 2016-10-14T14:54:07.653 に答える