如何从svn diff中排除某些文件?

时间:2013-05-07 08:52:14

标签: svn diff

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

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

3 个答案:

答案 0 :(得分:6)

由于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

答案 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"