【发布时间】:2010-02-12 14:22:28
【问题描述】:
我已经看到两个开发人员对一个代码文件进行了更改,如下所示:
x++
这样结束:
x++
x++
由于插入/删除了回车(我认为),一行代码被无声地合并为两行相同的代码(没有冲突)一切都可以编译,但突然测试失败并出现奇怪的行为。
这应该是可能的吗?我该如何防范?
【问题讨论】:
标签: svn version-control merge
我已经看到两个开发人员对一个代码文件进行了更改,如下所示:
x++
这样结束:
x++
x++
由于插入/删除了回车(我认为),一行代码被无声地合并为两行相同的代码(没有冲突)一切都可以编译,但突然测试失败并出现奇怪的行为。
这应该是可能的吗?我该如何防范?
【问题讨论】:
标签: svn version-control merge
为避免因行尾导致的合并问题,只需在这些文件上设置svn:eol-style 属性即可。
【讨论】:
这应该不是问题,除非进行合并的开发人员将冲突标记为已解决而没有进行审查。 SVN 将始终警告冲突。
仔细的合并跟踪,无论如何都是必需的,应该可以避免任何问题。
此外,一个小测试表明,如果要合并的更改已经应用,SVN 足够聪明,可以避免冲突。
以下示例(警告,与当前目录混淆;需要类 Unix 工具)模拟了您刚才描述的情况。
# Initialize repository
svnadmin create repo
REPO_URL="file:///$PWD/repo"
svn mkdir "$REPO_URL/trunk" "$REPO_URL/branches" -m "Initialize repository structure"
# Add main program
svn co "$REPO_URL" wc1
cd wc1/trunk
cat > main.pl << "EOF"
my $x=0;
print("$x\n");
EOF
svn add main.pl
svn ci -m "Add main.pl"
cd ../..
# Create branch
svn cp "$REPO_URL/trunk" "$REPO_URL/branches/exp" -m "Create \"exp\" branch"
# Branch developer makes a change
svn co "$REPO_URL" wc2
cd wc2/branches/exp
perl -i -wpe 'print("\$x++;\n") if $. == 2' main.pl
svn ci -m "Increment x"
cd ../../..
# Trunk developer makes the same change
cd wc1/trunk
perl -i -wpe 'print("\$x++;\n") if $. == 2' main.pl
svn ci -m "Increment x"
# Merge changes from branch
svn up
svn merge --reintegrate "$REPO_URL/branches/exp" .
cat main.pl
【讨论】:
这当然不可能。 SVN 合并通常会识别出本地已经进行了相同的更改。即使换行符发生变化,它至少应该识别变化的上下文并失败。
您可以通过在实际提交之前检查差异以及通过自动测试(就像您已经做过的那样)来防止这种情况发生。
你能重现这种行为吗?
【讨论】:
我已经看到合并出错了,有人解决了冲突,删除了两个合并版本并提交了仍然将两个版本合并在一起的主文件(因为你应该告诉 SVN 哪个是正确的.)
【讨论】: