LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1080|回复: 5

cvs/svn 可能导致的源码错误

[复制链接]
发表于 2007-7-28 14:22:33 | 显示全部楼层 |阅读模式
cvs/svn 确实有冲突检测功能, 不过总感觉这个功能反而会造成源码的不完整。

例如两个文件a.h a.cpp

a.h 内定义一个类
class a{
  int  n;
  void func1();
  void func2();
}

如果 a.cpp 如下

int a::func1(){
    n = 2;
    printf("func1\n");
}

int a::func2(){
    printf("func2\n");
}

现在两个人都 checkout 到这个版本,
第一个人将 a.h 内的 int n 这一行删除, a.cpp 内的 n= 2你这一行也删除 然后提交。
第二个人在 func2 中增加一行 n = 3, 然后提交, 自然是提交不了的, 于是 先 update,
由于 第二个人没有修改 a.h, 于是来自服务器的a.h覆盖了他本地的 a.h, a.cpp是两个人都
修改了的, 但一个人修改在 func1, 一个人修改在 func2, cvs/svn 认为可以自动合并, 于是
自己干了这件事, 最后进行提交, 那么最后的版本是什么呢?

a.h 是没有  n 定义被删除, 而 a.cpp func2中有 n = 3这样的表达式。 这样, 本来两个人的修改都是语法正确的, 先不管两个人做得事情互相冲突, 但经合并后的代码两个人的修改各保留一部分, 反而造成了无法通过编译的一个现状.

没有亲自试验, 不过推向开来, 应该没错的。
发表于 2007-7-28 15:51:59 | 显示全部楼层
头文件是接口,改接口之前,互相交流一下,避免这种问题产生
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-28 17:05:51 | 显示全部楼层
提出来只是说明svn/cvs可能存在的漏洞, 若要交流解决, 那没有什么不能解决的, 不用任何版本控制工具都可以
回复 支持 反对

使用道具 举报

发表于 2007-7-29 11:35:59 | 显示全部楼层
任何人向 cvs 提交之前都要保证自己提交的版本起码是可以 build 并能通过单元测试的。
回复 支持 反对

使用道具 举报

发表于 2007-7-29 21:57:59 | 显示全部楼层
LZ认为最后一个人在提交之前不需要检查一下代码能不能编译吗?
回复 支持 反对

使用道具 举报

发表于 2007-7-30 10:07:28 | 显示全部楼层
这个不关cvs的事吧,在CVS Manual里有下面几句:
cvs can do a lot of things for you, but it does not try to be everything for everyone.
     cvs is not a build system.
     cvs is not a substitute for management.
     cvs is not a substitute for developer communication. (尤其是这一段可以看看)
     cvs does not have change control.
     cvs is not an automated testing program.
     cvs does not have a built-in process model.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表