我正在寻找能够检测函数是否在文件中移动的版本控制系统。例如,有一个文件“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看到函数应该是不同的,并在“b()”下移动“c()”:
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也许能够以同样的方式跟踪块的移动。
答案 0 :(得分:3)
正如马克已经说过的那样 - 这不是SCM本身的问题,而是在其中使用Merge-Compare工具,它们都是(或多或少)以diff风格为导向(即使用字符串,而不是逻辑代码块)
我无法在(Linux)diff tool that recognizes block movement BeyondCompare中提及,但在Windows世界的比较中!完美地检测(并显示)移动的字符串块(并且在某种程度上 - 移动并稍微改变内部)。但是:
我还听到了一些谣言,SmartSVN Professional中的冲突解决方案也能够检测移动的代码块