是否有一个版本控制系统可以显示对特定方法或功能的更改?[关闭]


11

有时候能够说出这样的话会很好:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

查看自上次提交以来对源文件中特定功能所做的更改或更改的完整历史记录。我的问题有两个:

  1. 是否存在这样做的东西?
  2. 这样的工具会实用吗?为了比较该函数的不同版本,它必须对每个修订版本进行一些简单的代码解析;开销是否太高而无法提高效率?

7
这样做的需要似乎是一个潜在问题的征兆,例如方法太大或类没有正确组织,因为任何有价值的VCS都会使您与众不同,并且向下滚动很容易如果类不是太大,则可以使用(或搜索)有问题的方法,并且您可以在整个类的上下文中查看该方法中的代码。简而言之,我认为方法解析过于具体。
罗伯特·哈维

@Robert这是一个很好的观点,我认为我好奇的动机部分是由于至少一点代码膨胀。我跟踪到一个特定方法的错误,并希望能够看到该方法的更改日志以查看它的中断位置,如果您急于进行完整的差异搜索,可能会有点不方便:)
jches

4
在非常有用的情况下,TortoiseXXX的Blame功能非常强大。您可以看到何时对方法中的所有行进行了最后更改,并使用正确的边距继续退回这些更改。
pdr

Answers:


14
  1. 据我所知,事实并非如此。也许可以,但是如果能做到的话,我不希望它成为生产质量。
  2. 我认为这不切实际,但并非出于您列出的原因。这是不切实际的,因为VCS必须具有语言意识才能支持这种功能。本质上,您将需要嵌入一些内容来解析语言文本(编译器执行的重要步骤之一)。这给您带来了很多额外的负担,VCS已经在做相当复杂的工作。
    但更重要的是,您需要为每种要支持的语言做同样的事情。卖点仅适用于C代码的VCS不会获得太大的吸引力。即使您忽略所有晦涩的语言,即使支持前10种语言也是一项艰巨的任务。

正如罗伯特指出的那样,与必须在diff工具中手动跳转到该方法相比,能够立即跳转到一个方法并没有太大的收获。


4
我仅次于语言依赖性和大量的冗余代码
Chander Shivdasani

1
但是,可以针对代码突出显示编辑器提出相同的论点。它们必须具有语言意识,并且确实存在。也许回报会更高(codez的彩色屏幕!)。我同意解析可能是最困难的部分。不过,支持最通用的语言并不难,特别是因为您不需要完全解析程序。
jches 2011年

8

svn实际上可以完成您想要的事情。

您可以使用以下命令:

svn diff -x -p program.c 

-x -p 提供了有关变更集的顶部“C”函数名。看起来像这样

@@ -97,6 +102,8 @@ int function1(int *x)

它不会过滤,但是您可以grep / search紧密地满足您的目的。

我猜这仅适用于“ C”(或C / C ++)。但是,我想,如果有需求,svn也会使其适用于其他语言。

我不太订阅论点VCS应该这样做。毕竟,我们希望所有的IDE或编辑器(如VIM,EMACS)都进行语法突出显示,这是每种语言所特有的,并同时支持多种语言。因此,VCS作为开发人员工具,也应支持此类功能。

当然,感谢您发现我的问题。我以前从未用过。


1

无需赘述,但...您可以查看Semantic Designs网站及其产品范围。他们提供了一些对语言敏感的工具,可以说缺乏更好的术语。



-1

要显示什么版本和作者最后修改了文件的每一行:

git blame filename

1
是的,但是Q要求一种方法来搜索文件中特定方法的更改。假设给定文件有100个修订,而您需要查找的修订中包括对特定功能的更改。
Caleb

版本控制不了解语法详细信息,也不在乎文件的类型。
Ghita

-1

ENVYSTORE都这样做。有趣的是,就像洛根·卡帕尔多(Logan Capaldo)提到的Monicello一样,这些也适用于Smalltalk。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.