我svn diff -c 789
用来展示在我们的软件版本 789 中所做的更改,但它显示了很多我不关心的文件,特别是测试文件。如何从差异中排除某些文件,例如与模式匹配的所有文件*Test.java
?
如果这很重要,我在 Windows 上使用 Cygwin。
由于svn diff
不允许从输出中排除特定文件,以下是可用于实现此目的的 BASH 脚本。
它需要两个参数:
file
带svn 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
顺便说一句,请记住 svn diff 命令与遵循 Unix 模块化理念的其他命令一样工作,其中每个命令都有标准输入和输出。您可以生成您自己的自定义脚本来列出您想要包含的文件,通过使用管道将该脚本的输出重定向到 svn diff 命令,然后将您的 diff 输出重定向到您想要创建的所需文件。只是为了更清楚:按照这个例子
svn diff `cat change_list.txt` > patch.diff
change_list.txt
其中是您要包含在差异中的文件,以空格分隔。例如,文件的内容可能是这样的:
“域/模型/实体.java”
“web_app/controllers/controller.java”
因此,按照这种方法,您的问题的唯一困难被简化为实现一个像 Adam 上面慷慨地写的脚本。
希望能帮助到你!
维克。
这就是我所做的:
FILES=$(svn status some_dir|grep ^M|cut -b2-|grep -v dir_to_remove)
test -n "$FILES" && svn diff "$FILES"