【问题标题】:Ignore multiline comments git diff忽略多行注释 git diff
【发布时间】:2017-11-02 22:23:43
【问题描述】:

我试图找出 C/C++ 源代码中只有源代码发生变化的显着差异。我知道您可以使用git diff -G<regex>,但在可以运行的正则表达式类型方面似乎非常有限。例如,它似乎没有提供在 C/C++ 中忽略多行 cmets 的方法。

在运行差异之前,git 或者最好是 libgit2 中是否有任何方法可以忽略 cmets(包括多行)、空格等?还是一种确定 diff 输出中的一行是否为注释的方法?

【问题讨论】:

  • 值得怀疑。如果你真的很坚持,你可以预处理这两个文件,然后比较输出。
  • 你试过什么 git diff 命令,用什么regex
  • @AndrewC 这就是我害怕的。目前,我们只是通过一个工具为每个版本提供 git cat-file 的输出,但是由于这两个文件都很大,因此会碰到大型 repos 的堆顶部。我正在尝试在我们的工具中找到某种使用 libgit2 的方法,以提高内存和时间效率。
  • 可以使用 gitattrubutes 更改用于特定文件的差异程序(通常通过文件扩展名),但似乎没有什么能阻止您为“*”文件定义“外部差异驱动程序”。
  • may tortoiseGit 可以通过 diff 的图形用户界面帮助您?

标签: c++ c regex git libgit2


【解决方案1】:

git diff -w 忽略空格差异。

您不能忽略多行 cmets,因为 git 是一个版本控制工具,而不是依赖于语言的解释器。它不知道您的代码是 C++。它不解析文件的语义,因此它无法解释什么是注释,什么不是。特别是,它依赖 diff(或配置的 difftool)来比较文本文件,并且需要逐行比较。

我同意@andrew-c 的观点,即您真正要求的是在没有 cmets 的情况下比较两段代码。更特别有用的是,您要求比较所有多行 cmets 已变成空行的代码行。您将空白行保留在那里,这样您就可以在正常副本上引用正确的行号。

因此,您可以手动将两种代码状态转换为空白多行 cmets...或者您可能会考虑构建自己的差异包装器来为您进行剥离。但后者可能不值得付出努力。

【讨论】:

    【解决方案2】:

    您可以使用Viewing git filters output when using meld as a diff tool 中所述的 git 属性和差异过滤器来调用 sed 脚本来实现此目的,但是如果您希望它处理所有情况,例如字符串文字中的注释定界符等,那么它本身就非常复杂。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2012-10-26
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多