如何在Git中处理Visual Studio的解决方案和项目文件?

26

我通常使用Git对.NET进行版本控制。在我的团队中,我们并行工作,并经常提交代码以集成到应用程序中。一切都很好,但是Visual Studio的解决方案和项目文件存在问题。我们发现有两种方法:

  1. 永远不要提交这些文件,每个人都有自己的文件
  2. 将这些文件包括在版本系统中

这两种方法都有优点和缺点,但基本上在从中央仓库拉取时我们总是有困难。下面是我们遇到的一些问题:(圆括号中是上述列表的参考)

  • 我们必须将其他人的文件包含在项目中(1)或包含我们最新的文件(2)
  • 如果我们使用不同的架构(x86 / x64),我们必须手动更改 .csproj 文件(2)
  • 引用和NuGet包也存在相同的问题

等等。 我可以使用适当的工作流程吗?

3个回答

18
提交 .sln.csproj 文件通常是最佳实践(如 this answer 所述),但合并需要一些注意事项。
请参见 "Why are my .csproj files getting messed up after a git rebase?"。 *.csproj -text merge=union(见下文)
*.sln -text merge=unionv
或者你可以放弃使用 .csproj 并在本地重新生成它们,as in this tweet
忽略这些 csproj 文件的另一个原因是如果它们被重新生成,in this context

yellowblood在评论中警告(链接),当使用merge=union策略时,csproj文件会出现严重的冲突问题。
这与文章"csproj文件中的合并冲突"相呼应。
这就是为什么有一个建议VS IDE应支持项目文件中的文件模式(以便如果添加符合该模式的新的.cs文件,则修改.csproj文件)。

有人建议如果Visual Studio先排序元素,这将有助于缓解问题。这有助于减少由Visual Studio表现出的非确定性元素排序引起的偶然冲突。但这并不能消除合并冲突的问题。

1
在许多VS项目中,会生成*.suo文件。将*.suo添加到你的.gitignore文件中。此外,你还需要将每个项目的bin/*文件添加到忽略文件中,因为它们都是二进制文件。如果你使用MS Test或其他单元测试框架,请添加TestResults文件夹。 - Greg Burghardt
1
csproj文件不应该有merge=union,否则会导致非常糟糕的合并。 - yellowblood
@yellowblood 很好的观点。我已经编辑了答案,以使该风险非常清晰,并添加了一些链接来支持该建议(不要.csproj文件使用merge=union)。 - VonC
1
在 .fsproj 文件中,文件顺序是重要的,因此对 .csproj 或支持的文件模式进行排序只会掩盖问题。 - brianary

6
在我们的项目中,我们将这些内容纳入版本控制。我们从GitHub上开始使用.gitignore和一个简单的.gitattributes文件:
# Auto detect text files and perform LF normalization
* text=auto

# Custom for Visual Studio
*.cs diff=csharp

这是因为在处理这些文件时,union合并策略实际上可能会很危险,详见csproj文件中的合并冲突。通常情况下,您每次都会遇到合并冲突,但在Visual Studio中很容易快速处理。例如,在向解决方案中添加一个新的空项目并提交它后,多个团队成员会向该项目中添加不同的文件。

理论上,您可以定义自定义合并驱动程序来更好地处理xml合并,但我尚未看到其他人这样做过。


2

今天是2020年4月8日,我建议将csprojsln文件标记为binary,但仍在努力寻找一种可靠的做法,目前还没有找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接