DVCS检测代码块移动

时间:2012-03-31 16:03:49

标签: git version-control mercurial dvcs

我正在寻找能够检测函数是否在文件中移动的版本控制系统。例如,有一个文件“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也许能够以同样的方式跟踪块的移动。

1 个答案:

答案 0 :(得分:3)

正如马克已经说过的那样 - 这不是SCM本身的问题,而是在其中使用Merge-Compare工具,它们都是(或多或少)以diff风格为导向(即使用字符串,而不是逻辑代码块

我无法在(Linux)diff tool that recognizes block movement BeyondCompare中提及,但在Windows世界的比较中!完美地检测(并显示)移动的字符串块(并且在某种程度上 - 移动并稍微改变内部)。但是:

  • CompareIT!成本(一些)钱
  • 未更新很长时间(自2010年11月起)
  • 不能用于3向合并(仅限2个面板差异)

我还听到了一些谣言,SmartSVN Professional中的冲突解决方案也能够检测移动的代码块