我已经看到两个开发人员代码对一个代码文件进行了哪些更改:
x++
这样结束:
x++
x++
由于插入/删除了回车(我认为),一行已经静默地合并为两行相同的代码(没有冲突)所有内容都编译但是突然测试失败并且随之发生奇怪的行为。
这可能吗?我该如何防范呢?
答案 0 :(得分:2)
为避免因行结尾而导致合并问题,只需在这些文件上设置svn:eol-style属性即可。
答案 1 :(得分:1)
当然不应该这样。 SVN合并通常认识到本地已经进行了相同的更改。即使换行符发生变化,它至少也应该识别出已更改的上下文并失败。
您可以通过在实际提交之前检查差异以及通过自动测试来防止这种情况(正如您已经做过的那样)。
你能重现这种行为吗?
答案 2 :(得分:1)
我已经看到合并出错的地方了,有人解决了冲突,删除了两个合并版本并提交了仍然将两个版本合并在一起的主文件(因为你应该告诉SVN哪个是正确的) 。)
答案 3 :(得分:1)
这不应该是一个问题,除非进行合并的开发人员将冲突标记为已解决且未经审核。 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