我正在寻找一个版本控制系统,它能够检测一个函数是否被移动到一个文件中。例如,有一个文件"Foo.java“,其中包含函数"a()”、"b()“和"c()”。
public class Foo
{
void a()
{
}
void c()
{
}
void b()
{
}
} 现在,如果用户A将方法"c()“更改为实际操作:
void c()
{
System.out.println("Function c is called");
}用户B认为函数应该是不同的,并将"c()“移到”b()“下:
public class Foo
{
void a()
{
}
void b()
{
}
void c()
{
}
}现在,如果它们都推进到集中式存储库,我希望结果是:
public class Foo
{
void a()
{
}
void b()
{
}
void c()
{
System.out.println("Function c is called");
}
} 现在发生的是冲突,用户A或用户B必须手动解决。在我看来,这应该是自动处理的,或者以某种方式显示。如果文件“没有那么大”,手动解决不是问题,但是包含800+行的文件并不那么清楚。
现在我已经测试了git和mercurial,两者都无法以我想要的方式解决这个问题。我以前使用过subversion,并且知道这是没有处理的,而且我的使用还有一些缺点,所以我更喜欢DVCS。
编辑:我(主要)试图完成的是保存函数的历史记录。例如,我知道Git可以显示某些线条的历史。然而,如果一个函数被移动,就很容易将运动混淆为函数的起源。DVCS应该检测到这个移动,因为它必须知道历史,就像文件的移动一样。Linus曾经说过,一个人只应该移动而不是修改一个文件,这样Git就可以“看到”这个移动。我想Git也许也能以同样的方式跟踪块的运动。
发布于 2012-04-01 06:56:27
正如Mark已经说过的,它本身并不是SCM的问题,而是在其中使用的合并比较工具,这些工具都是(或多或少)面向差异化的(即处理字符串,而不是逻辑代码块)。
在(Linux)diff tool that recognizes block movement BeyondCompare中,我什么也不能说,但是在Windows中!完美地检测(并显示)移动的字符串块(在某种程度上,在内部移动和改变)。但是:
。
我还听说,SmartSVN专业人员中的冲突解决程序也能够检测到移动的代码块
https://stackoverflow.com/questions/9957475
复制相似问题