【发布时间】:2010-04-20 08:16:03
【问题描述】:
我有两个几乎相似的源代码树,但无法访问源代码存储库,因此我被困在包含测试报告、文档、二进制文件等的发布包中。
diff 命令仅支持--exclude,但我想做类似diff -wbur --include='*.c,*.h' tree1 tree2 的操作
我知道this question 有点相关,但并没有真正解决我的问题。
忽略完全在 C cmets 中的更改块的奖励积分 :)
【问题讨论】:
我有两个几乎相似的源代码树,但无法访问源代码存储库,因此我被困在包含测试报告、文档、二进制文件等的发布包中。
diff 命令仅支持--exclude,但我想做类似diff -wbur --include='*.c,*.h' tree1 tree2 的操作
我知道this question 有点相关,但并没有真正解决我的问题。
忽略完全在 C cmets 中的更改块的奖励积分 :)
【问题讨论】:
对 google 的结果稍作修改,tree1 做了 find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;
【讨论】:
-name '*.h" -o -name "*.cpp"。
这是一个小补丁生成器脚本:
#!/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; }
【讨论】:
我会排除与 .c 或 .h 不匹配的所有内容。所以这意味着它只会包含 .c 和 .h 文件:
diff -x "*.[^ch]"
对我来说这是最好的方法,因为你只使用 diff
【讨论】:
您可以将所有要排除的文件写入一个临时文件,并将其提供给 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')
【讨论】:
我向 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 <PATCHFILE>
配置和编译
./configure
make
这将在 src/diff 中创建修补的差异
干杯
【讨论】: