2011-07-25 154 views
4

我有一個現場測試系統。該軟件正在使用SVN進行版本控制。實時版本是特定的TRUNK修訂版本。如何讓svn diff忽略某些文件?

現在我想創建一個從測試系統中的文件到現場系統的差異。我可以這樣做

# svn diff -r 12345 

在測試框上,其中12345是實時系統的修訂版本。這可以按照預期工作,但是項目已經將它的配置文件放在SVN下面了,當然,實時系統不會與測試系統共享配置,所以我需要排除它。

我對svn不太熟悉,它看起來像沒有切換到明確排除文件/目錄。

我想知道如果我需要爲作業編寫一個腳本來檢查已更改的文件,首先篩選該列表,然後將路徑提供給svn diff

回答

1

我創建了一個小shell腳本,是能夠列出自特定版本至少所有的修改,加上本地修改:

$ ./svn-modified-since 10563 

代碼:

#!/bin/bash 

LOCALBASE=$(svnversion -n|grep -oP "^\d+(?=M$)") 

# echo "Local base revision: $LOCALBASE" 

if [ ! $LOCALBASE ] 
    then 
     echo "Quit: No modifications in local copy found." 
     exit 
fi 

TARGETBASE=$1 

# echo "Target base revision: $TARGETBASE" 

if [ ! $TARGETBASE ] 
    then 
     echo "Quit: No target base revision given." 
     exit 
fi 

WORKPATH=$2 

# files changed in working directory copy 
FILES=`svn status $WORKPATH` 

# files changed between working copy and foreign base revision 
FILES="$FILES 
`svn diff --summarize -r $TARGETBASE:$LOCALBASE $WORKPATH`" 

回聲「$ FILES」 |排序-u

輸出示例:

M  common_functions.php 
M  config.php 
M  locale/fr/LC_MESSAGES/fr.mo 
M  locale/fr/LC_MESSAGES/fr.po 
M  common_functions.php 
?  tmp/surrogates.php 
... 

我現在可以篩選與輸出和grep使用文件名作爲參數與xargs

# ./svn-modified-since 10563 | grep -v "^\?" | grep -o "([^ ]+)$" | grep -v "config.php" | xargs svn diff --force -r 10563 > my.diff 

要處理二進制文件像LC_MESSAGES,我可以通過替換svn diff命令來實現它:

svn diff --force --diff-cmd /usr/bin/diff -x "-au --binary" -r 10563 

With

patch -p0 -i my.diff