You’ll need to use Jekyll.
Copying verbatim from the relevant documentation:
Sometimes it’s nice to preview your Jekyll site before you push your
gh-pagesbranch to GitHub. However, the subdirectory-like URL
structure GitHub uses for Project Pages complicates the proper
resolution of URLs. Here is an approach to utilizing the GitHub
Project Page URL structure (username.github.io/project-name/) whilst
maintaining the ability to preview your Jekyll site locally.
In
_config.yml, set thebaseurloption to/project-name– note the leading slash and the absence of a trailing slash.When referencing JS or CSS files, do it like this:
{{ site.baseurl}}/path/to/css.css– note the slash immediately following
the variable (just before “path”).When doing permalinks or internal links, do it like this:
{{ site.baseurl }}{{ post.url }}– note that there is no slash between
the two variables.Finally, if you’d like to preview your site before committing/deploying using
jekyll serve, be sure to pass an empty
string to the--baseurloption, so that you can view everything at
localhost:4000normally (without /project-name at the beginning):
jekyll serve --baseurl ''This way you can preview your site locally from the site root on
localhost, but when GitHub generates your pages from thegh-pages
branch all the URLs will start with/project-nameand resolve
properly.
(Apparently someone figured this out only a few months ago.)