I second that. SVN works quite nicely for deployment. If you're not using it, you should be. It changed my life. It's better than Tivo. You just import your project into SVN and then check it out in various places. I check out a copy in my development folder, my buddy checks out a copy on his development folder, and then we check out another copy on the production server. He makes a change, commits. I update(which pulls down his changes), make a change, and then commit. Once we've tested and feel comfortable with the changes, we go to the production server and do a simple 'svn update'. All changes are incorporated. If we later realize that we broke something, we can go back to the production server and do a quick revert to put it back the way it was one version ago (or several).Updates should always be pushed to the user in my opinion. Relying on a site to get a certain number of hits before it checks for an update is too risky; it might be a quiet site with a huge security issue.
Unless you're using an advanced ORM, obviously this won't sync up your database structure, but Navicat (for MySQL) has a really nice Data/Structure synchronization tool. It will mirror two database structures (and optionally data). It's commercial, but is very reasonably priced IMHO ($100 or so) .