Right now, I have a "live system" repository, and then development actually occurs in a second repository which is a submodule of the first.
This has a lot of advantages:
• Configuration and data is out-of-tree, so it is easy for me to have a read-only view of the live database, and read-write to a local (temporary) database
• I can select a branch using a signed cookie or a URL which makes it very easy to demonstrate features on the live system
• I can try out tags on 1% of traffic, or 5% of traffic, testing some features with my live users
• I can use git bisect on the live system to find regressions
There are a few disadvantages, but most of them are psychological: Testing on live sounds scary; how to make database migrations is a lot more work; etc.