SVN:和bash:如何判断是否存在未提交的更改

时间:2010-04-22 18:37:05

标签: svn bash

我正在尝试在shell脚本(linux / bash)中包装标准的步骤序列,似乎无法弄清楚如何判断svn status的执行是否返回了任何内容。例如

~/sandbox/$svn status
?       pat/foo
~/sandbox/$echo $?
0

如果我删除了foo文件,那么

svn status

什么都不返回,但echo $?仍为0

如果有未提交的更改,我想不要做一些步骤。

指针非常感谢。

6 个答案:

答案 0 :(得分:6)

为什么不测试svn status -q的结果?类似的东西:

result=`svn status -q`
[ -z "$result" ] && echo "No changes" && exit 1

echo "Changes found"
exit 0

如果您在回购协议中使用svn:externals,请参阅下面的评论和答案以了解其他方法。

答案 1 :(得分:4)

如果您的项目包含svn:externals引用,则接受的答案将无效。在这种情况下,即使工作副本没有本地修改,svn status -q仍将产生输出。例如,我的项目依赖于几个库,每个库都在存储库的单独部分中维护:

$ svn status -q
X       Externals/ETCKit
X       Externals/RulesParser
X       Externals/XMLRPC

Performing status on external item at 'Externals/ETCKit':

Performing status on external item at 'Externals/XMLRPC':

Performing status on external item at 'Externals/RulesParser':

为了解释这个额外的输出,我最终使用了awk

if [[ -n $(svn status -q . | awk '$1 ~ /[!?ABCDGKLMORST]/') ]]; then
    echo "The working copy at $(pwd) appears to have local modifications"
fi

此脚本获取svn status -q的输出,并过滤掉任何不以指示本地更改的状态代码开头的行。如果最终结果是空字符串,则工作副本是干净的。

答案 2 :(得分:3)

或者你可以试试

svn status | grep [AMCDG]
echo $?
如果有变化,

应该返回0,如果没有变化则返回1

答案 3 :(得分:2)

我已经实现了类似的东西。您不应该依赖svn status的返回值,而是解析其输出。例如,您应该查找以“M”,“A”,“D”等开头的行。您可以使用 perl 来帮助您。根据解析的结果,你肯定会知道是否有变化。

顺便说一下,如果没有变化,svn status返回0是不正常的 - 毕竟这个返回代码只表示没有发生错误。

答案 4 :(得分:1)

您可以使用kde.org中的svnversions测试修订号 http://websvn.kde.org/trunk/KDE/kdesdk/scripts/svnversions?view=log

答案 5 :(得分:0)

这是我用过的解决方案。使用svn externals并避免在脚本中明确列出svn状态(根据您的观点,这可能是也可能不是一件好事。)

# tested with svn 1.6.11/bash 4.1.2
if [ "$(svn st -q | cut -c -8 | sed '/^[^ ]*$/d' | grep -m 1 '[^ ]')" ]; then
    echo "changes detected"
fi

svn st -q - 列出没有外部目录X的状态 cut -c -8 - 删除除前8列之外的所有列 sed '/^[^ ]*$/d' - 删除使用外部时看到的“执行...”行 grep -m 1 '[^ ]' - 第一个非空格意味着修改。