Site Map - skip to main content

Hacker Public Radio

Your ideas, projects, opinions - podcasted.

New episodes every weekday Monday through Friday.
This page was generated by The HPR Robot at


hpr4342 :: How I use Git to blog on the web and gopherspace

How I use Git to blog on the web and gopherspace

<< First, < Previous, , Latest >>

Hosted by Klaatu on Tuesday, 2025-03-25 is flagged as Clean and is released under a CC-BY-SA license.
git, gopher. 1.

Listen in ogg, opus, or mp3 format. Play now:

Duration: 00:37:39
Download the transcription and subtitles.

general.

First, I create a Git repository some place on the server. This is the Git repo that's going to be populated with your content, but it doesn't have to be in a world-viewable location on your server. Instead, you can place this anywhere, and then use a Git hook or a cronjob to copy files from it to a world-viewable directory. I don't cover that here. I refer to this location as the staging directory.

Next, create a bare repository on your server. In its hooks directory, create a shell script called post-receive:

#!/usr/bin/bash
#
while read oldrev newrev refname
do
       BR=`git rev-parse --symbolic --abbrev-ref $refname`
       if [ "$BR" == "master" ]; then
               WEB_DIR="/my/staging/dir"
               export GIT_DIR="$WEB_DIR/.git"
               pushd $WEB_DIR > /dev/null
               git pull
               popd > /dev/null
       fi
done 
Now when you push to your bare repository, you are triggering the post-receive script to run, which in turn triggers a git pull in your staging directory.

Once your staging directory contains the content you want to distribute, you can copy them to live directories, or you could make your staging directory live (remember to exclude the .git directory though), or whatever you want.

For gopher, I create a file listing by date using a shell script:

#!/usr/bin/bash
SED=/usr/bin/sed
DIR_BASE=/my/live/dir
DIR_LIVE=blog
DIR_STAGING=staging
DATE=${DATE:-`date --rfc-3339=date`}
for POST in `find "$DIR_BASE"/"$DIR_STAGING" \
-type f -name "item.md" -exec grep -Hl "$DATE" {} \;`;
do 
POSTDIR=`dirname "$POST"`
cp "$POST" "$DIR_BASE"/"$DIR_LIVE"/`basename $POSTDIR`.txt
echo -e 0Latest'\t'../"$DIR_LIVE"/`basename $POSTDIR`.txt > /tmp/updater.tmp

echo -e 0"$DATE" `basename $POSTDIR`'\t'../"$DIR_LIVE"/`basename $POSTDIR`.txt \
>> /tmp/updater.tmp
"${SED}" -i "/0Latest/ r /tmp/updater.tmp" "$DIR_BASE"/date/gophermap
"${SED}" -i '0,/0Latest/{/0Latest/d;}' "$DIR_BASE"/date/gophermap
/usr/bin/rm /tmp/updater.tmp
done 

Comments

Subscribe to the comments RSS feed.

Comment #1 posted on 2025-03-25 15:46:06 by oxo

Cool!

Hi Klaatu, Cool to hear you back here! I am really missing my weekly GNU World Order. :)
Regards oxo

Leave Comment

Note to Verbose Commenters
If you can't fit everything you want to say in the comment below then you really should record a response show instead.

Note to Spammers
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to record a show about yourself, or your industry, or any other topic we may find interesting. We also check shows for spam :).

Provide feedback
Your Name/Handle:
Title:
Comment:
Anti Spam Question: What does the letter P in HPR stand for?