Philip just released his updated tool to keep track of customization versions in CRM 4.0 http://code.msdn.microsoft.com/crmversion. The concept is pretty straight forward, a plug-in that is triggered whenever you publish or publish all your customizations. Because the plug-in runs in synchronous mode I would recommend you to tailor it to only run on publish "All" or even better, write a workflow that triggers the "snapshot" generation based on time comparisons; why?
Because if you are like me and code/configure, publish and test very, very often; (I publish almost every change I do immediately) you may prefer to manually trigger the “snapshot” (which is possible using Philip’s add-in) or have an automated job that creates the snapshots, lets say.. every day at night; that way you don’t end up with a dozen+ versions of your work and you don’t slow down the publish process unnecessarily (exporting customizations and saving them as attachment can take precious seconds, perhaps minutes, of your development time once you have 100+ entities)
What do you do to keep CRM customization versions? TFS? How often do you take "snapshots"?