我正在使用svn diff -c 789
来显示我们软件的修订版789中所做的更改,但它显示了许多我不关心的文件,特别是测试文件。如何从diff中排除某些文件,例如所有匹配模式*Test.java
的文件?
我在Windows上使用Cygwin,如果这很重要的话。
答案 0 :(得分:6)
由于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
答案 1 :(得分:4)
顺便说一句,请记住,svn diff命令可以像Unix模块化哲学中的其他命令一样工作,其中每个命令都有一个标准输入和输出。 您可以使用自己的自定义脚本来列出要包含的文件,通过使用管道将该脚本的输出重定向到svn diff命令,然后将diff的输出重定向到您要创建的所需文件。 为了更清楚:按照这个例子
svn diff `cat change_list.txt` > patch.diff
change_list.txt
中的是要包含在由空格分隔的差异中的文件。例如,文件的内容可能是:
“域/模型/ entity.java”
“web_app /控制器/ controller.java”
因此,按照这种方法,你的问题的唯一不足之处就是减少了实现像Adam慷慨写的那样的脚本。
希望它有所帮助!
维克。
答案 2 :(得分:1)
这就是我所做的:
FILES=$(svn status some_dir|grep ^M|cut -b2-|grep -v dir_to_remove)
test -n "$FILES" && svn diff "$FILES"