15

在一个使用 GIT 进行源代码控制的 .NET C# 项目中,我在重新定位以获取最近提交的代码后,不断收到格式错误的 csproj 文件。这是我的过程:

  1. 提交我的代码
  2. 构建和运行测试
  3. 变基以“获取最新”
  4. 诅咒天堂,因为 csproj 文件被搞砸了......再次

这是变基的输出:

D:\GitHub\AwesomeProject>git rebase master
First, rewinding head to replay your work on top of it...
Applying: added getstatus call
Using index info to reconstruct a base tree...
M       Host/Host.csproj
M       Host/packages.config
M       Trees/Trees.csproj
M       Trees/packages.config
M       UnitTests/UnitTests.csproj
<stdin>:1229: trailing whitespace.
  <!-- To modify your build process, add your task inside one of the targets bel
ow and uncomment it.
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging UnitTests/UnitTests.csproj
Auto-merging Trees/packages.config
CONFLICT (content): Merge conflict in Trees/packages.config
Auto-merging Trees/Trees.csproj
Auto-merging Host/packages.config
CONFLICT (content): Merge conflict in Host/packages.config
Auto-merging Host/Host.csproj
Failed to merge in the changes.
Patch failed at 0001 added getstatus call

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

存在冲突,但正如您所见,它自动合并了 csproj 文件,但它做错了!!csprojfile 的 XML 无效,项目未加载。这是它的外观的精简版:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ... most of one version the project file
  <Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ... most of the other version the project file
  <Import Project="$(SolutionDir)\.nuget\nuget.targets" />
</Project>

为什么会这样?以及如何改进我的流程来处理它?

4

1 回答 1

20

You may want to use a .gitattributes file to use a slightly different merge driver. I have found that this has helped with mine:

*.csproj -text merge=union
*.sln -text merge=union

You can read more about it here to see if there are options you like better.

You can also tell git to take a little longer thinking about its merges with the patience option like this: (read more here)

git rebase -s recursive -X patience

The only other thing that I can think of is to make sure that you pull code often so that the merges git has to do are smaller.

FYI, if you want you can do a rebase on the same line at the same time that you do a pull like this: (and you can still pass in the recursive and patience options the same)

git pull --rebase origin master
于 2012-11-20T22:52:35.050 回答