如何让svn diff忽略一些文件?

时间:2011-07-25 12:19:49

标签: svn file diff

我有一个实时和测试系统。该软件使用SVN进行版本控制。实时版本是特定的TRUNK版本。

现在我想从测试系统中的文件创建一个diff到live系统。我可以用

做到这一点
# svn diff -r 12345

在测试框中,12345是实时系统的修订版。这可以按预期工作,但是项目也将它的配置文件放在SVN下,当然实时系统不会与测试系统共享配置,所以我需要将其排除。

我对svn不太好,看起来没有专门排除文件/目录的转换。

我想知道是否需要首先编写一个脚本来检查已更改文件的作业,过滤该列表然后将PATH提供给svn diff

1 个答案:

答案 0 :(得分: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”| sort -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

使用

patch -p0 -i my.diff