【问题标题】:How to diff just the source files?如何仅区分源文件?
【发布时间】:2010-04-20 08:16:03
【问题描述】:

我有两个几乎相似的源代码树,但无法访问源代码存储库,因此我被困在包含测试报告、文档、二进制文件等的发布包中。

diff 命令仅支持--exclude,但我想做类似diff -wbur --include='*.c,*.h' tree1 tree2 的操作

我知道this question 有点相关,但并没有真正解决我的问题。

忽略完全在 C cmets 中的更改块的奖励积分 :)

【问题讨论】:

    标签: c diff


    【解决方案1】:

    对 google 的结果稍作修改,tree1 做了 find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;

    【讨论】:

    • 对于 C++ 源代码树,请在上述命令中尝试 -name '*.h" -o -name "*.cpp"。
    【解决方案2】:

    这是一个小补丁生成器脚本:

    #!/bin/bash
    
    USAGE="USAGE: $0 <dist dir> <edited dir>"
    
    [ '--help' == "$1" ] && { echo $USAGE; exit 0; }
    [ 2 -eq $# ] || { echo $USAGE; exit 1; }
    
    # trim starting './' and trailing /'/
    original=$(echo $1 | sed 's-^\./--;s-/$--')
    changed=$(echo $2 | sed 's-^\./--;s-/$--')
    
    [ -d $original ] || { echo "ERROR: Directory $original does not exist" >&2 ; exit 2; }
    [ -d $changed ] || { echo "ERROR: Directory $changed does not exist" >&2; exit 3; }
    
    #command="ls -l"
    command="diff -Naur"
    
    find $original -name '*.[ch]' -o -name '*.cpp' | sed 's-^[^/]*/--' | { while read file; do $command  $original/$file $changed/$file; done; }
    

    【讨论】:

      【解决方案3】:

      我会排除与 .c 或 .h 不匹配的所有内容。所以这意味着它只会包含 .c 和 .h 文件:

      diff -x "*.[^ch]"
      

      对我来说这是最好的方法,因为你只使用 diff

      【讨论】:

      • 这不能正常工作:它包含 .cpp、.hxx、.cache 和 .help 等扩展名。
      【解决方案4】:

      您可以将所有要排除的文件写入一个临时文件,并将其提供给 diff 的 -X 参数。

      find tree1 tree2 -type f -not -name '*.[ch]' >exludes
      diff -wbur tree1 tree2 -X excludes
      

      或者更简单(在 Bash 中工作):

      diff -wbur tree1 tree2 -X <(find tree1 tree2 -type f -not -name '*.[ch]')
      

      如果您有更长的文件扩展名,您可以使用多个名称参数:

      diff -wbur tree1 tree2 \
        -X <(find tree1 tree2 -type f -not -name '*.java' -and -not -name '*.sql')
      

      【讨论】:

        【解决方案5】:

        我向 diff 维护者提出了一个比 find 更简单的解决方案,这里是线程: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

        这个想法是提供一个新选项,指示 diff 解析匹配正则表达式的文件,例如: diff -Nurp --only "*.[hc]" source/ source-new/

        这里是修补 diffutils 的说明

        克隆仓库 git clone git://git.savannah.gnu.org/diffutils.git

        在 diffutils 目录中运行 bootstrap.sh 并解析依赖关系,直到它创建 ./cofigure 脚本

        从上面的链接下载补丁

        应用它 git apply &lt;PATCHFILE&gt;

        配置和编译 ./configure make

        这将在 src/diff 中创建修补的差异

        干杯

        【讨论】:

        • 我已经添加了解决我问题的补丁。现在对我来说似乎是一个很好的答案:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多