我们的团队使用svn来管理我们的来源。在C文件上执行重新因子时,我偶尔会更改函数并在文件中移动它们。一般来说,我试图避免移动函数,因为它使得默认的svn diff对于正在发生的事情有点混淆,并且它经常提供一个比它需要的更混乱的差异。
尽管如此,偶尔我会进行功能文件位置更改,并更改内部代码更改功能。另一个出现的地方是分支合并,当文件发生冲突时,其中一个或两个分支都有移动以及内部函数更改。
所以,我正在寻找的是一个语义识别的差异工具,可以告诉我两个级别的差异 - 功能安排和细节(内部功能)。我尝试使用“-p”选项diff(-x -p到svn diff),但这不是它的目的,它肯定没有做我想要的。
我刚才想到的另一个选择是使用diff程序来捕捉代码复制,例如大学可能会用来检查作业,但是在快速搜索中没有明显的东西。
答案 0 :(得分:1)
使用您的工具执行此操作的一种方法是先移动功能,检查它们,然后更改它们。或者有两个登记,当你看到这种情况发生时,将它们移到另一个中,然后再解决合并问题。它将工作转移给您,但使代码审查更容易。
答案 1 :(得分:0)
因为您在上一次编辑时稍微提高了问题的难度级别:
svn可以做什么,这就是为什么写git的原因。您的问题的答案基本上是“不,没有工具可以使用svn在语义级别上跟踪代码”
(实际上git也没有可用的语义跟踪工具,它跟踪内容)
答案 2 :(得分:0)
我在不同提交中进行外观修改(移动函数)和功能更改,并在提交消息中添加“化妆品”。这样,化妆品工作的巨大和无趣的差异被忽略了,你对功能变化有一个简洁的差异。
答案 3 :(得分:-2)
您可以尝试使用git进行重构:
当使用git时,整个'保持代码移动与更改分开'有一个更基本的原因:git可以跟踪代码移动(再次,无论是移动整个文件还是只移动文件之间的函数),并执行' git blame -C'实际上会遵循文件之间的代码移动。它通过相似性分析来做到这一点,但它确实意味着如果你同时移动代码和改变它,git就看不到'哦,那个函数最初来自那个其他文件',现在你的代码实际起源的地方会变得更糟。
所以,想法是初始化一个git存储库并重放所有相关的svn-commit到该存储库。之后,使用git找出哪些内容移动到哪里。