We use subversion. All branches we are ready to roll to production are first branched (in subversion this bacially looks like a copy in the “branches” folder … of you adhere to the best practices recommendations).
This branch is then tested in our test environment and adjusted as needed for production rollout (timeouts etc etc).
When it is ready to be moved to production we simply run an svn update on our production in the folder for that site in the local copy of subversion and update the symbolic link in HCIROOT to point to this new site. This way we have instant rollback capability if something goes wrong.
/SVNROOT/sites/site1/
trunk/ (this is where all development code is kept)
branches/production-20050101 (branch made on 1/1/2005)
branches/production-20060101 (branch made on 1/1/2006)
In HCIROOT on our development server:
site1_dev is a symbolic link to /SVNROOT/sites/site1/trunk
In HCIROOT on our production server:
site1 is a symbolic link to /SVNROOT/sites/site1/production-20060101
Apart from this we also load configuration files for some of our things like ODBC connections etc that are named according to the site. In dev we will load site1_dev.ini and in production it will be site1.ini.
This whole mechanism works real well for us … there are some complexities. If anyone is interested just send me an email or PM.