summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--web/tutorials/github-pages-tutorial.md130
1 files changed, 130 insertions, 0 deletions
diff --git a/web/tutorials/github-pages-tutorial.md b/web/tutorials/github-pages-tutorial.md
new file mode 100644
index 0000000..5e5c104
--- /dev/null
+++ b/web/tutorials/github-pages-tutorial.md
@@ -0,0 +1,130 @@
+## Using Hakyll with GitHub Pages
+
+In the interest of keeping this guide as simple as possible, I'll be making a few assumptions.
+
+1. Haskell is being used with [Stack](http://docs.haskellstack.org/en/stable/README/).
+2. Creating a user/organization site (vice a project site).
+3. You haven't changed Hakyll's default output directory of '_site/'.
+
+These instructions should be easy to adapt for any situation though.
+
+### GitHub Setup
+
+1. If required, create a new repository for your blog.
+2. If required, create a ```master``` branch.
+2. If applicable/desired, create/add to your repository any files that your site needs that will not be produced by your Hakyll project. For example, ```CNAME``` as outlined [here](https://help.github.com/articles/setting-up-your-pages-site-repository/).
+3. Create a ```.gitignore``` file with at a minimum, the following entries:
+
+```
+_cache/
+_site/
+.stack-work/
+```
+
+### Local setup
+
+1. If required, create a new Hakyll project. If you're a stack user, there is a Hakyll template available that makes this step easy.
+
+```stack new myblog hakyll-template```
+
+2. Create a ```.gitignore``` file in your blog's directory with at a minimum, the same directories listed as in the GitHub repository.
+3. Use the following git commands to setup your local repository.
+
+```
+git init
+# create new branch called develop and switch to it.
+git checkout -b develop
+# track all the source files for our blog.
+git add .
+# make our first commit
+git commit -m "initial commit."
+# and add the GitHub repository as a remote.
+git remote add origin <URL to your GitHub pages repository>
+```
+
+### Deployment
+
+So everything's all setup and we're ready to deploy.
+
+> Note: Performing the following commands from your ```develop``` branch is recommended since you will end up back in that branch at the end.
+
+Temporarily save any uncommitted changes that may exist in the current branch.
+
+```git stash```
+
+Ensure we are in the correct branch.
+
+```git checkout develop```
+
+Get a clean build of our site.
+
+```
+stack exec myblog clean
+stack exec myblog build
+```
+
+Update the local list of remote branches to ensure we're able to checkout the branch we want in the next step.
+
+```git fetch -all```
+
+Switches to a new branch called "publish" that tracks the origin "master" branch. **Note:** Checking out the publish branch does not overwrite the files that Hakyll just produced because we have '_site' in both .gitignore files.
+
+```git checkout -b publish --track origin/master```
+
+Copy the freshly made contents of '_site' over the old ones. Note that if a file is *no longer* being produced (for example if you deleted a blog posting), it will continue to persist in your published site until it's been removed from that repository as well.
+
+```cp -a _site/. .```
+
+Commit our changes.
+
+```
+git add -A
+git commit -m "publish."
+```
+
+And send them to GitHub.
+
+```git push origin publish:master```
+
+Final clean up and return to the original state.
+
+```
+git checkout develop
+git branch -D publish
+git stash pop
+```
+
+### *And that's it.*
+
+Here is a full listing of the script.
+
+```
+# Temporarily store uncommited changes
+git stash
+
+# Verify correct branch
+git checkout develop
+
+# Build new files
+stack exec myblog clean
+stack exec myblog build
+
+# Get previous files
+git fetch -all
+git checkout -b publish --track origin/master
+
+# Overwrite existing files with new files
+cp -a _site/. .
+
+# Commit
+git add -A
+git commit -m "publish."
+
+# Push
+git push origin publish:master
+
+# Restoration
+git checkout develop
+git branch -D publish
+git stash pop
+```