How can I sync documentation with Github Pages?
我和几个人一起做了一个项目,我们有一个
另外,在阅读了Github项目目录页上文档文件之间的相对链接工作之后。我非常喜欢降价,因为这样可以节省大量的时间,不用手工编写文档中的所有HTML。不过,我希望能够有一个
换句话说,我的问题是:
- 有没有办法让我的readme.md文件自动更新我的Github页面子域?
- [编辑]:如果使用自动页面生成器,答案似乎是"否"。您必须转到repo的设置页面,并在每次发生更改时重新加载它,以便更新它。nbsp;
- 有没有一种方法可以让我的相关链接指向我的readme.md文件上的文档在我的Github页面上工作,也许是我以某种方式将我的
/docs/*.md 同步到我的Github页面,并以某种方式呈现和/或主题化它们?- [编辑]:根据我在写这个问题后学到的知识,似乎只有通过使用静态站点生成器(如Ruby Gem Jekyll)以及下面的注释中提到的Github支持的Webhook的一些用法,Github页面上才可能出现这种情况。我正在尝试寻找一个最佳的解决方案。nbsp;
- 更好的是,有没有一种更简单的方法可以做到这一点,也许我只有一份readme.md和文档的副本,可用于GH页面和我的主分支,并使所有事情变得简单?
- [编辑]:看起来这一个几乎肯定是不可能的。我正在考虑在Github中内置某种东西的可能性。似乎对这类东西更好的支持将来可能会内置到Github页面中,或者至少我肯定希望如此。nbsp;
我将发布一个我设置的解决方案,它利用了这样一个事实:Github页面使用的是已经使用自动页面生成器的Jekyll。
nbsp;
1 2 3 | --- layout: index --- |
您还需要打开
从
找到项目页面主题的CSS。对我来说,这是一条像下面这样的线:
江户十一〔11〕。
需要将此更改为
埃多克斯1〔12〕
这样,Jekyll将把降价文件作为
创建了名为
nbsp;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #!/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='--- layout: index --- ' # 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 |
号
编辑:我为
用以下命令创建文件
1 2 | markdown: redcarpet path: http://username.github.io/reponame |
上面的脚本还同步了
1 2 3 4 5 6 7 | $(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]); }); }); |
。
编辑:我在我的存储库中更改了上面的代码,这是一种快速而肮脏的方法,但是如果你知道我的意思,它在任何情况下都不会正常工作。例如,标记文件
1 2 3 4 5 6 7 8 9 | $(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上设置了一个repo示例,它在这里有一个项目页面,如果您想了解所有这些如何一起工作的话。
我对将自述文件与Github页面同步的问题的解决方案与上述略有不同。可以使用Github API返回呈现为HTML的降价文件,而不是使用单独的javascript降价引擎。
将解码后的
1 2 3 4 5 | { "text":"<README>", "mode":"markdown", "context":"<owner>/<repo>" } |
像BradRhodes所做的那样,将呈现的HTML插入到DOM元素中。
此方法的两个注意事项:
对于低流量页面,如果加载时间不是关键的(~1-2秒),那么上述方法就足够有效了。
您可以使用documentup来呈现readme.md。
另一个需要考虑的方法是设置一个预提交挂钩,它构建相关的页面。我在我的一个存储库中这样做。不过,您可能需要放弃自动页面生成器,只需自己推到
在那个存储库中,我这样做是为了使
不管怎样,我提出这个问题的理由是因为我希望有人有一个更好的工作流程。这个方法有点复杂,不灵活,它要求每个人保持他们的钩子同步。
我对在您的文档站点和主Github repo之间共享单个自述文件有几个想法:
您只能使用一个包含代码和Jekyll文档站点的GH页面分支。您的存储库可能会变得有点混乱,您需要在自述文件的顶部放置一个yaml头文件。它几乎支持相对链接。问题是,如果你想让Jekyll呈现你的标记,它会给它一个.html扩展名。也许有一种方法可以配置这个。我举了一个例子来看看它是否有效。
您可以在文档站点中使用Ajax调用从主分支中读取自述文件,然后使用JavaScript标记渲染器进行渲染。如果不编写一些巧妙的javascript,这将需要更长的时间来加载,并且不支持相关链接。它也比IDEA 1更容易实现。
Nathan和BrandRhodes描述的另一种方法是使用一个伟大的工具:由RicoSta创建的flatDoc。克鲁兹。
FlatDoc将由Ajax加载文档(readme.md或任何其他markdown文件),对其进行解析,并显示所有好东西,甚至还有用于导航的侧边栏菜单!
它在其API中内置了一个助手方法,可以从Github repo master加载文件(但也可以从Web加载其他任何地方)。
说明
从将以下HTML模板复制到GH页面分支的index.html中开始。继续:
- 将"用户"替换为您的Github用户名
- 将"repo"替换为您的github repo名称
- 将"您的项目"替换为项目名称
在文件中。在浏览器中本地试用。然后提交并推动更改。现在,您的Github页面将始终使用主分支中的readme.md文件进行更新。
如果默认主题对您不满意,您可以用自己的CSS重新设计它的样式。
另一个我已经非常成功地工作的方法是使用Ajax来获取文档,使用GitHub API和一个JavaScript Markdown引擎来呈现HTML(正如Nathan建议的那样)。
内森表示了一些对性能的关注,但在我的经验中,它看起来很快就会加载,所以我不认为这实际上是一个问题。
其优点是易于设置,即使您只是在GitHub上的浏览器中直接编辑标记,它也会始终更新您的文档。
我在Github页面上的http://bradrodes.github.io/githubdocsync/设置了一个示例,以显示它的工作状态。
我还想在master中编辑文档并在gh页面中发布文档-我喜欢使文档与源代码保持最新,这似乎是最好的方法。这是我正在进行的工作,但我以Cory的脚本为出发点,并对其进行了一些扩展,使其能够在开箱即用的情况下运行,只要有一个带有
埃多克斯1〔32〕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #!/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 '--- title: Docs layout: default --- {% 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 '--- title: Docs layout: default home: --- ' > _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 [cc] print" "$0 } else { } } } |
。
与原版的另一个不同之处在于,它在所有页面中都设置了一个变量
1 | <link rel="stylesheet" href="{{ page.home }}css/main.css"> |
。
这样我就可以编辑CSS,在本地构建Jekyll站点,在浏览器中查看结果,而无需等待Github在服务器上构建它。
这并不难,两份拷贝和粘贴到终端,你都设置好了。
值得一看的是如何在Github上建立一个超级准系统
只需运行此一次性设置(将整个代码块和PASE复制到终端),就可以复制两个文件并使页面与当前的自述文件保持一致:
1 2 3 4 5 6 7 8 9 10 | # 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 |
号自动化
然后,我们只需要在每次推送之前自动将所有更改从
1 2 3 4 5 6 7 8 9 10 11 12 13 | $(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页面生成器来解决这个问题——它使用多个MD文件和一个配置文件生成多页站点。
它正确地更新了页面之间的所有链接。将更改提交回gh pages分支相对容易成为CI的一部分。
我在这里和这里使用它。