J'ai un projet avec plusieurs personnes et nous avons un fichier README.md
avec un tas de GitHub Flavored Markdown qui est rendu sur notre page GitHub. Nous avons également créé une branche GitHub Pages hébergée dans le sous-domaine de notre organisation GitHub et utilisé le générateur de pages Automatic en chargeant simplement dans notre fichier README.md
lors de la création de notre page. Cependant, je remarque que lorsque je mets à jour notre fichier README.md
, il ne met pas à jour la page de projet. Au lieu de cela, nous devons accéder à l’onglet Paramètres GitHub et recréer la page du projet, en rechargeant le fichier README.md
lorsque nous le faisons.
De même, après la lecture de lien relatif , travailler entre les fichiers de documentation sur les pages du répertoire du projet GitHub. J'aime beaucoup le démarquage car il permet de gagner beaucoup de temps, car il faut écrire tout le code HTML manuellement pour notre documentation. Ce que j'aimerais cependant, c'est pouvoir avoir un fichier README.md
qui puisse inclure des liens relatifs vers d'autres fichiers de documentation situés à docs/*.md
. J'espérais qu'il existait une solution simple pour que mes autres fichiers de documentation puissent également être inclus dans ma branche gh-pages et être hébergés sous mon sous-domaine GitHub Pages et être restitués et/ou thématisés.
En d'autres termes, mes questions sont:
/docs/*.md
sur mes pages Github et en quelque sorte les rendant et les thématisant? Je vais publier une solution que j'ai configurée et qui tire parti du fait que GitHub Pages utilise Jekyll en utilisant déjà le générateur de page automatique.
git checkout gh-pages
mkdir _layouts
mv index.html _layouts
git checkout master -- README.md
mv README.md index.md
index.md
---
layout: index
---
Vous devez également ouvrir le fichier index.html
et apporter les modifications suivantes:
Supprimez le code HTML rendu du démarquage dans votre fichier README.md
. Cela se situe généralement entre les balises <section>
et <article>
. Remplacez ce code HTML par le texte {{ content }}
, ce qui nous permettra d’utiliser ce fichier en tant que jekyll. Le fichier auquel nous appliquons la mise en page sera placé à l'emplacement de la balise de contenu.
Localisez le CSS pour le thème de votre page de projet. pour moi, c'était une ligne comme celle-ci:
<link rel='stylesheet' href='stylesheets/stylesheet.css' />
Cela doit être changé pour
<link rel='stylesheet' href='{{ site.path }}/stylesheets/stylesheet.css' />
{{ site.path }}
.Ce faisant, Jekyll convertira le fichier de démarquage en contenu de la disposition index.html
dans le répertoire _layouts
. Afin d'automatiser ce processus non seulement pour le fichier README.md, mais également pour les autres documents que vous pouvez avoir dans votre branche principale, j'ai suivi les étapes suivantes:
Créé le fichier appelé post-commit
contenant les éléments suivants:
#!/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: J'ai mis à jour le script ci-dessus pour le fichier README.md
et le démarquage dans docs/*
afin qu'ils utilisent le même fichier de présentation. C'est une bien meilleure configuration que celle que j'avais auparavant. Ce script va dans votre répertoire .git/hooks/
. bash doit être sur votre chemin.
Créez le fichier _config.yml
avec les éléments suivants
markdown: redcarpet
path: http://username.github.io/reponame
Le script ci-dessus synchronise également les fichiers de démarquage trouvés dans le répertoire docs/*
de la branche master
, afin de pouvoir également les visualiser sur le site GitHub Pages. La liaison relative à ces documents fonctionne si vous incluez la fonction jQuery suivante afin de supprimer l’extension .md
des ancres de la branche gh-pages
. Vous pouvez ajouter le script suivant à index.html
dans le répertoire _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]);
});
});
EDIT: J'ai changé le code ci-dessus dans mon référentiel, c'était une façon rapide et sale de le faire, mais cela ne fonctionnera pas correctement dans tous les cas si vous voyez ce que je veux dire. company.mdata.md
ne serait pas traité correctement. Pour résoudre ce problème, j'ai mis à jour le script suivant qui vérifie plus attentivement le href et supprime l'extension si elle est trouvée. J'ai également rendu le script plus générique, lui permettant ainsi de supprimer d'autres extensions en modifiant la variable ext
. Voici le code:
$(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));
});
});
J'ai installé un exemple de dépôt dans CoryG89/docsync , qui a une page project ici , si vous voulez voir comment tout cela fonctionne ensemble.
Ma solution au problème de la synchronisation d'un README avec une page Github s'écarte légèrement de la précédente. Au lieu d'utiliser un moteur JavaScript Markdown distinct, vous pouvez utiliser l'API Github pour renvoyer un fichier Markdown au format HTML.
README.md
à partir de https://api.github.com/repos/<owner>/<repo>/contents/README.md
.window.atob( JSON.parse( blob ).content );
Postez la README
décodée sur https://api.github.com/markdown
dans un corps JSON
{
"text": "<README>",
"mode": "markdown",
"context": "<owner>/<repo>"
}
Insérez le code HTML rendu dans un élément DOM, comme indiqué par Brad Rhodes .
Deux mises en garde à cette approche:
Pour une page à faible trafic où le temps de chargement n'est pas critique (~ 1-2sec), alors la méthode ci-dessus fonctionne assez bien.
Vous pouvez utiliser DocumentUp pour afficher votre fichier README.md.
J'ai quelques idées pour partager un seul fichier lisez-moi entre votre site de documentation et le dépôt principal de github:
Vous ne pouvez utiliser qu'une seule branche gh-pages contenant à la fois votre code et un site de documentation jekyll. Votre référentiel peut devenir un peu encombré et vous devrez mettre un en-tête YAML en haut du fichier Lisez-moi. Il presque supporte les liens relatifs. Le problème est que si vous voulez que jekyll rende votre démarque, cela lui donnera une extension .html. Peut-être qu'il y a un moyen de configurer cela cependant. _ { Voici un exemple que j'ai assemblé pour voir si cela fonctionne. } _
Vous pouvez utiliser les appels AJAX de votre site de documentation pour lire le fichier readme de votre branche principale, puis le restituer avec un rendu Javascript Markdown Cela prendra un peu plus de temps à charger et ne supportera pas les liens relatifs sans que vous n'écriviez du code Javascript intelligent. C'est aussi plus de travail à mettre en œuvre que l'idée 1.
Un autre chemin à considérer est la mise en place d'un crochet pre-commit qui construit les pages pertinentes. Je le fais dans un de mes dépôts . Vous devrez probablement abandonner le générateur de page automatique et appuyer simplement sur la branche gh-pages
vous-même, tout en faisant quelque chose d'extraordinaire pour transformer vos documents en HTML ou en un site Jekyll, comme le suggère Nathan suggère .
Dans ce repository I Push like this pour garder gh-pages
identique à master
. Il y a beaucoup de d'autres façons de le faire aussi. Cela pourrait ne pas être idéal pour votre situation cependant (vous pourriez ne pas vouloir qu’elles soient identiques).
Quoi qu'il en soit, la raison pour laquelle j'avais offert une prime sur cette question était parce que j'espérais que quelqu'un aurait un meilleur flux de travail. Cette méthode est un peu compliquée et inflexible et elle oblige tout le monde à garder ses crochets synchronisés.
Une autre possibilité pour la méthode décrite par Nathan et Brand Rhodes est d’utiliser un excellent outil: FlatDoc créé par Rico Sta. Cruz.
FlatDoc va charger par ajax la documentation (README.md ou tout autre fichier de balisage), l'analyser et l'afficher avec tous les goodies et même un menu de barre latérale pour la navigation!
Il a intégré dans son api une méthode d'assistance pour charger des fichiers à partir de GitHub Repo Master (mais peut également charger n'importe où sur le Web).
Instructions
Commencez par copier le modèle html suivant dans votre fichier index.html dans votre branche gh-pages. Continue avec:
dans le fichier. Essayez-le localement dans votre navigateur. Puis validez et appuyez sur les modifications. Maintenant, votre page github sera toujours mise à jour avec votre fichier README.md dans votre branche principale.
Si le thème par défaut ne vous satisfait pas, vous pouvez le reformater avec votre propre css.
Une autre méthode qui fonctionne assez bien consiste à utiliser Ajax pour récupérer les documents à l'aide de l'API Github et d'un moteur de démarquage Javascript pour restituer le code HTML (comme l'a également suggéré Nathan).
Nathan a exprimé certaines inquiétudes quant aux performances, mais d'après mon expérience, le logiciel se charge apparemment instantanément, donc je ne pense pas que ce soit un problème.
L'avantage est qu'il est facile à configurer et qu'il mettra toujours à jour vos documents, même si vous modifiez simplement la réduction directement dans un navigateur sur github.
J'ai mis en place un exemple sur les pages Github à http://bradrhodes.github.io/GithubDocSync/ pour le voir fonctionner.
Je souhaite également éditer des documents dans master et les publier dans gh-pages. J'aime garder les documents à jour avec le code source, ce qui semble être le meilleur moyen. C’est un travail en cours pour moi, mais j’ai pris le script de Cory comme point de départ et l’a un peu élargi pour le faire fonctionner dès qu’il existe une branche gh-pages avec _layouts
(c’est-à-dire un jeky site). Il convertit les clôtures de style backtick (pour les blocs de code) qui fonctionnent bien dans la navigation dans les sources de github, mais pas dans les gh-pages. J'utilise un index.md
avec une inclusion pour le projet README.md
afin de pouvoir ajouter un en-tête et quelques autres décorations. Cette version gère également la documentation dans tous les répertoires imbriqués appelés "docs" que je trouve utiles dans un projet avec plusieurs modules (pas les sous-modules git, mais juste les sous-répertoires):
.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
}
}
}
Une autre variante de l'original est qu'il définit une variable page.home
dans toutes les pages. Cela peut être utilisé pour localiser le chemin relatif du répertoire racine, afin de localiser des ressources statiques comme css. Dans _layouts/.default.html
j'ai:
<link rel="stylesheet" href="{{ page.home }}css/main.css">
De cette façon, je peux éditer le fichier css, construire le site jekyll localement et voir le résultat dans un navigateur sans devoir attendre que github le construise sur le serveur.
Ce n'est pas difficile, deux copies et colle dans le terminal et vous êtes tous ensemble.
Jekyll
vous permet d'importer votre fichier de démarquage, puis de le convertir en HTML. L'astuce consiste à importer votre README.md
dans votre fichier index.md
avec {% include_relative README.md %}
. Voici comment nous pouvons faire cela:
Cela vaut la peine de vérifier comment configurer un site Jekyll
sur une base de barebones super sur github (c'est juste deux fichiers!)
Vous pouvez copier les deux fichiers et conserver votre page avec votre fichier Lisez-moi actuel en exécutant simplement cette configuration one time (copiez tout le bloc de code et passez-la au terminal):
# 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
Ensuite, nous devons simplement automatiser la tâche consistant à copier toutes les modifications de master
dans la branche gh-pages
avant chaque Push. Nous pouvons le faire en exécutant ce script (vous pouvez le copier et le coller dans le terminal)
$(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
Il créera un hook qui copiera toutes les modifications de la branche master
dans gh-pages
à chaque exécution de git Push
.
C'est tout. Terminé.
J'ai récemment créé un paquet gh-pages-generator pour résoudre ce problème, il génère un site de plusieurs pages utilisant plusieurs fichiers MD et un fichier de configuration.
Il met correctement à jour tous les liens entre les pages. Il est relativement facile d'intégrer dans CI les modifications apportées à la branche gh-pages.