代码之家  ›  专栏  ›  技术社区  ›  Peter

如何获得基于C函数的差异?

  •  4
  • Peter  · 技术社区  · 15 年前

    我们的团队使用SVN来管理我们的源代码。在对C文件执行重新考虑时,我偶尔会同时更改函数并在文件中移动它们。一般来说,我尽量避免移动函数,因为它会使默认的SVN diff对正在发生的事情有点混乱,而且它经常提供比需要的更混乱的diff。

    同样,偶尔我会同时更改函数文件位置和函数内部代码。另一个出现的地方是分支合并,当文件发生冲突时,其中一个或两个分支都有移动以及函数内部的更改。

    所以,我要寻找的是一个语义感知的diff工具,它可以告诉我两个层次的diff——函数排列和细节(函数内部)。我尝试使用“-p”选项进行diff(-x-p到svn diff),但这并不是它的目的,它肯定没有做我想要的。

    我刚才想到的另一个选择是使用一个diff程序来捕获代码复制,比如大学可能会使用它来检查作业,但是在快速搜索中没有明显的发现。

    4 回复  |  直到 15 年前
        1
  •  1
  •   i_am_jorf    15 年前

    使用您所拥有的工具来完成这项工作的一种方法是,首先移动函数,签入它们,然后更改它们。或者有两个征兵,当你看到这种情况发生时,将它们移到一个,SVN向上移动,解决合并问题。它将工作转移到您身上,但使代码审查更容易。

        2
  •  0
  •   akira    15 年前

    由于您上次编辑时稍微增加了问题的难度:

    SVN所能做的是有限的,这就是为什么要写Git的原因。您的问题的答案基本上是“不,没有工具可以用SVN在语义级别跟踪代码”。

    (实际上,Git也没有可用的语义跟踪工具,它跟踪内容)

        3
  •  0
  •   orip    15 年前

    我在不同的提交中进行外观更改(移动函数)和功能更改,并在提交消息中放置“cosmetics”。这样一来,化妆品工作中巨大而无趣的差异就被忽略了,而您对于功能变化有一个简洁的差异。

        4
  •  -2
  •   akira    15 年前

    您可以尝试使用 git :

    当使用git时,整个“保持代码移动与更改分开”有一个更根本的原因:git可以跟踪代码移动(同样,无论是移动整个文件还是只在文件之间移动一个函数),而执行“git责备-c”实际上会跟踪文件之间的代码移动。通过相似性分析可以做到这一点,但这确实意味着如果你们都移动代码 同时更改它,Git看不到“哦,这个函数最初来自另一个文件”,现在您会得到关于代码实际起源的更糟糕的注释。

    因此,我们的想法是初始化一个Git存储库,并将所有相关的SVN提交重放到该存储库中。之后,使用git找出哪些内容移动到了哪里。