10

svn diff -c 789用来展示在我们的软件版本 789 中所做的更改,但它显示了很多我不关心的文件,特别是测试文件。如何从差异中排除某些文件,例如与模式匹配的所有文件*Test.java

如果这很重要,我在 Windows 上使用 Cygwin。

4

3 回答 3

8

由于svn diff不允许从输出中排除特定文件,以下是可用于实现此目的的 BASH 脚本。

它需要两个参数:

  • filesvn diff输出
  • pattern要排除的文件(例如test/*

并打印 的内容,而file没有匹配的文件的更改pattern

#!/bin/bash

test $# -ne 2 && echo "Usage: $0 svn_diff_file exclude_pattern" && exit 1

ignore=0
while IFS= read -r line; do
    echo $line | grep -q -e "^Index: " && ignore=0
    echo $line | grep -e "^Index: " | grep -q -e "^Index: $2" && ignore=1
    test $ignore -eq 0 && echo "$line"
done < $1

更新

我刚刚遇到了一个可以完成这项工作的工具:filterdiff。它的用法与上面的脚本非常相似:

filterdiff svn_diff_file -x exclude_pattern

于 2013-05-07T13:46:38.803 回答
4

顺便说一句,请记住 svn diff 命令与遵循 Unix 模块化理念的其他命令一样工作,其中每个命令都有标准输入和输出。您可以生成您自己的自定义脚本来列出您想要包含的文件,通过使用管道将该脚本的输出重定向到 svn diff 命令,然后将您的 diff 输出重定向到您想要创建的所需文件。只是为了更清楚:按照这个例子

svn diff `cat change_list.txt` > patch.diff

change_list.txt其中是您要包含在差异中的文件,以空格分隔。例如,文件的内容可能是这样的:

“域/模型/实体.java”

“web_app/controllers/controller.java”

因此,按照这种方法,您的问题的唯一困难被简化为实现一个像 Adam 上面慷慨地写的脚本。

希望能帮助到你!

维克。

于 2013-08-28T18:38:29.297 回答
1

这就是我所做的:

FILES=$(svn status some_dir|grep ^M|cut -b2-|grep -v dir_to_remove)
test -n "$FILES" && svn diff "$FILES"
于 2017-07-25T10:42:00.430 回答