How I deal with Visual Studio solution and project files in Git?
Committing .sln
and .csproj
files is usually the best practice (as in this answer), but merging requires some attention.
See "Why are my .csproj
files getting messed up after a git rebase
?".
(see below)*.csproj -text merge=union
*.sln -text merge=union
v
Or you can give up on .csproj
and regenerate them locally as in this tweet.
Another reason to ignore those csproj files is if they are regenerated, as in this context
yellowblood warns (in the comments) about serious conflict issue with csproj
file when used with the merge=union
strategy.
That echoes the article "Merge conflicts in csproj
files".
That is why there is a suggestion for VS IDE should support file patterns in project files (in order to not modify the .csproj
file if one add a new .cs
file that fits that pattern).
It's been suggested that if Visual Studio sorted its elements first, that would help mitigate the problem.
That helps reduce the incidental conflicts caused by Visual Studio's apparent non-deterministic sort of elements.
But it doesn't make the issue of merge conflicts go away.
In our project we check these into version control. We started with the .gitignore
from github and a simple .gitattributes
file:
# Auto detect text files and perform LF normalization* text=auto# Custom for Visual Studio*.cs diff=csharp
This is because the union
merge strategy can actually be dangerous for these files, see Merge conflicts in csproj files for details why this is not always safe and is probably not what you want.
You'll generally get merge conflicts every time but they're really easy to handle quickly in Visual Studio. An example case is adding a new empty project to a solution and committing it, then having multiple team members add different files to the project.
In theory you could have a custom merge driver defined that handles xml merges better, but I haven't seen that done by anyone else yet.
It's 2020-04-08 and my choice for this is mark csproj
and sln
files as binary
, still trying to find a sturdy practice but it's still not existed.