2011-07-25 63 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