2013-05-07 212 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" 
相關問題