One of my main goals with source control is "clone and go". You make a copy of the site out of your SCM of choice (I use Mercurial), and it a) just works, and b) doesn't show a bunch of changed files just from running the site (correct ignore list). The more I try to achieve this with Mercurial and Composite C1, however, the more I find that it's just impossible.
For example, the Composite.Forms.Contact package adds a file to App_Code which references a data type that is put in Composite.Generated.dll--and if you don't version control this DLL (which gets recompiled dynamically and sometimes unnecessarily, so it's hard to know--in the interest of minimizing repository bloat--whether you need to commit this file), you get a chicken-egg problem because the site will no longer compile and run unless you rename all offending files in App_Code, run the site, then rename the files back (which is far out of the realm of "clone and go").
And then you have the fact that C1 needs a lot of metadata for layouts and functions, which is stored in either XML (which I haven't been able to figure out how to version control sanely, and the sample .hgignore file on http://docs.composite.net/Getting-started/C1-and-Version-Control/Composite-C1-and-Mercurial doesn't achieve what I want) or a database (which I haven't figured out how to version control at all). It's very easy for these things to get out of sync between developers. I don't want changes that I make to result in another developer being unable to work until we manually sync things up after I'm done with my changes. I haven't run into this yet because I haven't had to work with other developers on a C1 project, so I don't know how much of an issue this is in practical terms, but I am concerned that it can cause lost productivity.
So, my question is, what's the "right" way to version control a C1 website? What will make it easiest to keep track of code changes, collaborate with other developers, upgrade C1, and get back to a good state if I screw something up?