Hosting on GitHub Pages#

Creating a gh-pages branch#

To host your docs on GitHub Pages, we need to enable GitHub Pages for our repo. To do that, we need to create a branch that only contains html files. We’ll name this branch gh-pages, as GitHub looks for this name and automatically starts hosting your documentation on pages.

Let’s create gh-pages as an orphan branch, which means there is no previous history and commits:

# from the project root
cd ./docs/_build/html
git checkout --orphan gh-pages      # create the orphan branch
git reset --hard                    # overwrite all changes in the directory
git commit --allow-empty -m "Init"  # create a commit without any changes
git push origin gh-pages

In your remote repository, you should now see a new empty gh-pages branch. You will notice that under Settings > Pages, GitHub has enabled Pages and started hosting your site at a URL like https://<username>.github.io/sphinxy/. Of course, if you visit the URL, you get a 404 Error because there are no files yet on the gh-pages branch.

Next, we locally mount the orphan gh-pages branch as a subdirectory using git worktree.

# from the docs/_build/html dir
cd ..
git checkout main
rm -rf html  # make sure you don't have an existing target directory
git worktree add html gh-pages

To check that you set up branches correctly, you should see that git branch shows gh-pages under the html subdirectory, but see the main branch as usual outside of html:

# from the project root
$ git branch
    gh-pages
  * main

$ cd ./docs/_build/html

$ git branch
  * gh-pages
    main

Our branch gh-pages is completely empty. But GitHub will be looking for a top-level index.html. So from the ./docs/_build/html directory let’s create a simple one:

# from the docs/_build/html dir
echo '<h1>Hello, World!</h1>' > index.html
git add index.html
git commit -m "Add hello world landing page"
git push origin gh-pages

Go to the Actions tab of your repo’s GitHub URL. You should see that a pages-build-deployment workflow has kicked off. This is a workflow that rebuilds your GitHub Pages site and is triggered by our push to gh-pages. Once it’s completed, refresh the Pages URL where your site is hosted. You should see the heading Hello, World!.

Cleaning the HTML files#

In the previous section, we mounted the gh-pages branch at ./docs/_build/html. But you may occasionally want to clean your documentation build output. Running make clean inside your docs directory will remove everything under _build.

This means that, if you want to be able to push more updates to gh-pages, you will need to recreate the git worktree every time you make clean:

git worktree add -f html gh-pages.

To make this easier, add the following to docs/Makefile:

clean:
	@$(SPHINXBUILD) -M clean "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O);
	cd _build; git worktree add -f html gh-pages

With these changes, make clean will clean the _build/ directory, and populate the html directory with the current contents on the gh-pages branch. So it will effectively clean your local documentation changes.

Commit your updated Makefile:

# from the project root
git add docs/Makefile
git commit -m "Add updated clean target in Makefile"
git push origin main

Disabling Jekyll#

Before we can deploy our API docs on GitHub Pages, we need to tell GitHub not to use Jekyll: a static site generator tool that GitHub Pages uses by default. We could turn off its usage by committing an empty .nojekyll file our _build/html folder.

Instead of committing a .nojekyll file, you can add the extension sphinx.ext.githubpages to your conf.py. It automatically adds the .nojekyll file on make html.

extensions = [
    "sphinx.ext.autodoc",
    "sphinx.ext.napoleon",
    "sphinx.ext.githubpages",
]

Let’s also commit the change in conf.py:

# from the project root
git add docs/conf.py
git commit -m "Add githubpages extension"
git push origin main

Hosting the documentation#

Next, we want to add the Sphinxy documentation to gh-pages. Let’s generate our documentation again and check in our output files.

cd docs
make clean  # clean and re-create the gh-pages worktree
make html
cd _build/html
git branch  # verify you're in gh-pages branch
git add -A
git commit -m "First documentation commit"
git push origin gh-pages

Go back to your repo’s Action tab. Once pages-build-deployment workflow has completed, hit refresh on your Pages URL.

🎉 Congratulations! 🎉

Now your documentation is now live on GitHub Pages! You should be able to navigate around the website and share the URL with the world!

{: .hint } 🙌 You have now reached the 07-gh-pages part of the tutorial. If not, check out that branch and gh-pages-7 branch for gh-pages-7 and continue from there.


[Previous: Selecting a theme](./6-selecting-a-theme.md){: .btn .float-left} [Next: Automating documentation updates](./8-automating-documentation-updates.md){: .btn .btn-purple .float-right}