Static sites in this context just means non-database driven sites. Your static site can be an elaborate PHP script or just a few markup and image files. For this I am using Jekyll – A neat Ruby gem that makes your static sites dynamic. It lets you create layouts and embed custom variables in your HTML (this is a “prototype” of the site).
Jekyll tackles all the nuisances involved in creating static pages (I used to add just enough PHP to make a layout). It works by running your prototype through some parsers and outputs plain static HTML/XML (RSS feeds) etc. It’s perfect for lightweight sites that would be impractical on WordPress, like a few static pages of information, landing pages, portfolio/resume pages, and parked domains.
Git takes care of keeping your development (local) and production (remote) environments synced. Git might be a little confusing if you’re learning it with the mindset that it works like Subversion.
I’ll update this post when the guide is done. For now, the following will assume you’re familiar with Jekyll (or at least have an empty file in the prototype directory) and git. This Bash script simplifies creating the remote git repository:
** please read through the code and make sure you know what this does, and what you’re doing. As of now, this is bias towards my own Apache/vhost setup. It’s trivial to edit for your specific needs. You’re using this at your own risk.
#!/bin/sh # # 04/01/2009 | http://biodegradablegeek.com | GPL # # You should be in site (NOT public) root (be in same dir as public/ log/ etc) # proto/ is created and will house the jekyll prototype # public/ will be the generated static site # the public/ folder will be REMOVED and regenerated on every push # if [ -z "$1" ]; then echo "Usage: ./repogen.sh domain.comn" exit fi # optional. will make it easier to copy/paste cmd to clone repo SSHURL="ssh.domain.com" URL="$1" echo "** creating tmp repo" mkdir proto cd proto git init touch INITIAL git add INITIAL git commit -a -m "Initial Commit" echo "** creating bare repo" cd .. git clone --bare proto proto.git mv proto proto.old git clone proto.git rm -rf proto.old echo "** generating hook" HOOK=proto.git/hooks/post-update mv $HOOK /tmp echo '#!/bin/sh' >> $HOOK echo '# To enable this hook, make this file executable by "chmod +x post-update".' >> $HOOK echo '#exec git-update-server-info' >> $HOOK echo '' >> $HOOK echo '' >> $HOOK echo 'URL='"$URL" >> $HOOK echo 'PROTO="/home/$USER/www/$URL/proto"' >> $HOOK echo 'PUBLIC="/home/$USER/www/$URL/public"' >> $HOOK echo '' >> $HOOK echo 'export GIT_DIR="$PROTO/.git"' >> $HOOK echo 'pushd $PROTO > /dev/null' >> $HOOK echo 'git pull' >> $HOOK echo 'popd > /dev/null' >> $HOOK echo '' >> $HOOK echo "echo -----------------------------" >> $HOOK echo "echo '** Pushing changes to '$URL" >> $HOOK echo "echo '** Moving current public to /tmp'" >> $HOOK echo 'mv "$PUBLIC" "/tmp/'$URL'public-`date '+%m%d%Y'`"' >> $HOOK echo 'echo "** Generating new public"' >> $HOOK echo 'jekyll "$PROTO" "$PUBLIC"' >> $HOOK echo "** enabling hook" chmod a+x $HOOK echo "** clone repo on local machina. example:" echo "git clone ssh://$USER@$SSHURL/~$USER/www/$SSHURL/proto.git"
Your site structure might be different. repogen.sh is made by pasting the above code in a new file, and then chmod a+x to make it executable. This should be done on the remote server.
cd www/domain.com/ ls public/ private/ log/ cgi-bin/ ./repogen.sh domain.com
Now on your local machine, clone the new repo, move your files in, and push:
git clone ssh://[username]@ssh.domain.com/~[username]/www/domain.com/proto.git cd proto/ cat "hello, world" > index.htm git add index.htm git commit -a -m 'first local commit' git push
After you push your changes, the post-update hook will delete the public/ directory (the root of the site). This dir and its contents are automatically generated and will get wiped out on EVERY push. Keep this in mind. All your changes and content should reside in proto/.
The proto/ repo will pull in the new changes, and then Jekyll will be invoked to generate the updated site in public/ from the prototype.
Should you need to edit it, the post-update hook is in the bare git repo (proto.git/hooks/)
Thanks to the authors in the posts below for sharing ideas. I first read this git method on dmiessler’s site.