A: 

IMO, project files such as .csproj should not be part of the versioning system, since they aren't source really.

They also almost certainly are not mergeable.

Paul Nathan
just because they aren't source doesn't mean they cannot be in the repo. Lots of files are not strictly source and they're in the repo.
Michael Wiles
Project files are xml that maintain a list of references and project contents, they are text and should be in version control. If I add a class to a project and don't have my csproj in version control, when someone else tries to edit the solution or project my class won't show up for them.
Nick
If the .csproj file is a file needed to build, it should be checked in.
system PAUSE
Everything that *is needed* to build should be in the repo. You should be able to make a check out/update and builb from source.
voyager
The problem is, the project files are getting clobbered. So they aren't strictly source; they need to be treated differently.
Paul Nathan
Clobbered how? Clobbered in the sense that changes from multiple users are merged together in a single file?
Nick
I don't understand. Step 1 in Vault or VSS for downloading an existing project is to specify the .csproj or .sln file from the source control database. How would a developer ever set up a project without a current proj file?
John
csc and ms make? (my preferred solution)
Paul Nathan
I understand the do-it-yourself attitude, I was a linux guy for a long time. But when doing Windows development, why go to extra lengths to do more work when Visual Studio is actually a pretty good IDE.
Nick
Well, the project IDE files having clobbering problems from user conflicts seems to be a good case for an independent build file. And, yes, there are cases where you can't escape the IDE, I know.
Paul Nathan
A: 

We are using subversion with no check-in/check-out restrictions on any files in a highly parallel environment. I agree that the renegade files issue is a matter of discipline. Not using merge doesn't solve the underlying problem, what's preventing the developer from copying their own "fixed" copy of code over other people's updates?

Merge is a pita, but that can be minimized by checking in and updating your local copy early and often. I agree with you regarding breaking checkins, they are to be avoided. Updating your local copy with checked in changes on the other hand will force you to merge your changes in properly so that when you finally check-in things go smoothly.

With regards to .csproj files. They are just text, they are indeed mergeable if you spend the time to figure out how the file is structured, there are internal references that need to be maintained.

I don't believe any files that are required to build a project should be excluded from version control. How can you reliably rebuild or trace changes if portions of the project aren't recorded?

segy
+3  A: 

The problem with update and merge that you guys ran into was rooted in a lack of communication between your group and the consulting group, and a lack of communication from the consulting group to your group as to what the problem was, and not necessarily a problem with the version control method itself. Ideally, the communication problem would need to be resolved first.

I think your technical analysis of the differences between the two version control methodologies is sound, and I agree that update/merge is better. But I think the real problem is in the communication to the people in your group(s), and how that becomes apparent in the use of version control, and whether the people in the groups are onboard/comfortable with the version control process you've selected. Note that as I say this, my own group at work is struggling through the exact same thing, only with Agile/SCRUM instead of VC. It's painful, it's annoying, it's frustrating, but the trick (I think) is in identifying the root problem and fixing it.

I think the solution here is in making sure that (whatever VC method is chosen) is communicated well to everyone, and that's the complicated part - you have to get not just your team on board with a particular VC technique, but also the consulting team. If someone on the consulting team isn't sure of how to perform a merge operation, well, try to train them. The key is to keep the communication open and clear so that problems can be resolved when they appear.

sheepsimulator
+1  A: 
  1. Use a proper source control system (svn, mercurial, git, ...)
  2. If you are going to do a lot of branching, don't use anything less recent than svn 1.6. I'm guessing mercurial/git would be an even better solution, but I don't have too much hands-on-experience using those yet.
  3. If people constantly are working on the same parts of the system, consider the system design. It indicates that each unit has too much responsibility.
  4. Never, ever accept people to offline for more than a day or so. Exceptions to this rule should be extremely rare.
  5. Talk to each other. Let the other developers know what your are working on.

Personally I would avoid having project files in my repository. But then again, I would never ever lock developers to one tool. Instead I would use a build system that generated project files/makefiles/whatever (CMake is my flavor for doing this).

EDIT: I think locking files is fixing the symptoms, not the disease. You will end up having developers doing nothing if this becomes a habit.

larsm
He's talking about developing with Visual Studio. Project files are part and parcel of the IDE.
Nick
I'm using Visual Studio and we don't have any project files in the repository. In fact, the only place project files are stored is locally. They are generated from CMake.
larsm
+1  A: 

I have worked on successful projects with teams of 40+ developers using the update-and-merge model. The thing that makes this method work is frequent merges: the independent workers are continuously updating (merging down) changes from the repository, and everyone is frequently merging up their changes (as soon as they pass basic tests).

Merging frequently tends to mean that each merge is small, which helps a lot. Testing frequently, both on individual codebases and nightly checkouts from the repository, helps hugely.

system PAUSE