我正在尝试在shell脚本(linux / bash)中包装标准的步骤序列,似乎无法弄清楚如何判断svn status
的执行是否返回了任何内容。例如
~/sandbox/$svn status
? pat/foo
~/sandbox/$echo $?
0
如果我删除了foo文件,那么
svn status
什么都不返回,但echo $?
仍为0
如果有未提交的更改,我想不要做一些步骤。
指针非常感谢。
答案 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 '[^ ]'
- 第一个非空格意味着修改。