我有一个实时和测试系统。该软件使用SVN进行版本控制。实时版本是特定的TRUNK版本。
现在我想从测试系统中的文件创建一个diff到live系统。我可以用
做到这一点# svn diff -r 12345
在测试框中,12345是实时系统的修订版。这可以按预期工作,但是项目也将它的配置文件放在SVN下,当然实时系统不会与测试系统共享配置,所以我需要将其排除。
我对svn不太好,看起来没有专门排除文件/目录的转换。
我想知道是否需要首先编写一个脚本来检查已更改文件的作业,过滤该列表然后将PATH提供给svn diff
。
答案 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