Some notes on using git to manage development and production versions of a website on a Linux server, based on Using Git to manage a web site. There seem to be several web pages with similar ideas out there: I don’t know who wrote it down first. And also with reference to Version Control with Git by Jon Loeliger.
I’ve adapted those ideas for the way I like to do things:
- I SSH in to the server, and do the editing there, using vim.
-
I have separate domains for development and production versions of my sites. For the purposes of these notes, they’re called
dev.example.org
andwww.example.org
. So the development version is also an active real-world website: my nginx configuration makes it only visible to me. -
The document roots are
/var/www/website
and/var/www/website-dev
respectively. -
The ‘bare’ production git repository can be anywhere on the server. I’ll put it at
/var/www/website.git
. It’s a git convention to use the.git
extension for bare repositories.
The steps for setting it up are as follows. I’ll leave the setting of suitable permissions and use of sudo as an exercise for the reader.
-
Put some web pages in
/var/www/website-dev
. -
mkdir /var/www/website cd /var/www/website-dev git init git add <all the appropriate files and directories>
-
Create a
.gitignore
file, and add everything that shouldn’t be transferred to production, such as configuration files that specify the development database and debug settings. For a WordPress site, that probably includes most of the WordPress stuff. -
git commit -a -m "a message" mkdir /var/www/website.git cd /var/www/website.git git --bare init
-
Create
/var/www/website.git/hooks/post-receive
containing:#!/bin/bash GIT_WORK_TREE=/var/www/website git checkout -f
- In the following, I’ve used ‘live’ as an alias for the production environment; you could use ‘prod’ or whatever you fancy.
-
chmod +x /var/www/website.git/hoots/post-receive cd /var/www/website-dev git remote add live file:///var/www/website.git git push live +master:refs/heads/master git push --set-upstream live master git push live
-
And, as if by magic, the files from the master branch of
/var/www/website-dev
are now in/var/www/website
. -
Then whenever you’ve got new code ready to into production, all that’s required is:
git push live