2013-05-07 215 views
7

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

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

+0

这是不可能的从'SVN diff'排除任何文件。你可以做的是使用一个工具,它能够过滤(也排除)你不关心的文件的变化,或者编写一个脚本来解析'svn diff'的输出,从你想要的文件中移除变化排除。如果你对这样的脚本感兴趣,请提供关于你的环境的更多细节 - 操作系统和shell。 – 2013-05-07 12:24:52

+0

@Adam我在Windows 7上使用Cygwin。 – MikeFHay 2013-05-07 12:28:08

回答

5

由于svn diff不允许从输出中排除特定文件,因此下面是一个BASH脚本,可用于实现该功能。

它有两个参数:

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

并打印file的未经改变的内容来自匹配pattern的文件。 filterdiff

#!/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 svn_diff_file -x exclude_pattern

+1

这很好,但如果是巨大的diff文件,只需在所需文件中调用'svn diff'而不是过滤所有内容的差异会更好。如果您有这样的问题,请参阅下面的Victor的答案。 – Martin 2016-04-27 14:18:19

3

对了,记得SVN的diff命令跟随在Unix的模块化理念,其中每个命令有一个标准的输入和输出中的作品为别人的命令。 您可以创建自己的自定义脚本,用于列出要包含的文件,通过使用管道将该脚本的输出重定向到svn diff命令,然后将diff的输出重定向到您想要创建的所需文件。 只是为了更清楚:按照这个例子

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

的是要在用空格分隔DIFF中包含的文件。例如,文件的内容可能是这样的:

“域/模型/ entity.java”

“web_app /控制器/ controller.java”

所以下面这种方法,你的问题的唯一困难就是减少实施一个像亚当慷慨地写在上面的脚本。

希望它有帮助!

Vic。

1

这是我做过什么:

FILES=$(svn status some_dir|grep ^M|cut -b2-|grep -v dir_to_remove) 
test -n "$FILES" && svn diff "$FILES" 
相关问题