Here’s an easy way of thinking about it:
nothing that is automatically generated as a result of building
your project should be in source control. For the .NET folks, this
means pretty much everything in the “bin” and
“obj” folders which will usually be .dll and .pdb
files.
Why? Because if you do this, your co-workers will
hate you. It means that every time they pull down a change from VCS
they’re overwriting their own compiled output with yours.
This is both a merge nightmare (you simply can’t do it), plus
it may break things until they next recompile. And then once they
do recompile and recommit, the whole damn problem just gets
repeated in the opposite direction and this time you’re on
the receiving end. Kind of serves you right, but this is not where
we want to be.
Of course the other problem is that it’s
just wasteful. It’s wasted on the source control machine
disk, it’s wasted in bandwidth and additional latency every
time you need to send it across the network and it’s sure as
hell a waste of your time every time you’ve got to deal with
the inevitable conflicts that this practice produces.
So we’re back to the “ignore”
patterns mentioned earlier on. Once paths such as “bin”
and “obj” are set to ignore, everything gets really,
really simple. Do it once, commit the rule and everybody is
happy.
In fact I’ve even gone so far as to write
pre-commit hooks that execute on the VCS server just so this sort
of content never makes it into source control to begin with. Sure,
it can be a little obtrusive getting your hand slapped by VCS but,
well, it only happens when you deserve it! Besides, I’d far
rather put the inconvenience back on the perpetrator rather than
pass it on to the entire time by causing everyone to have conflicts
when they next update.