我试图在shell脚本(linux/bash)中包装一个标准的步骤序列,似乎无法弄清楚如何判断执行svn status
返回的任何东西.例如
~/sandbox/$svn status
? pat/foo
~/sandbox/$echo $?
0
Run Code Online (Sandbox Code Playgroud)
如果我删除了foo文件,那么
svn status
Run Code Online (Sandbox Code Playgroud)
什么都不回,但echo $?
仍然是0
如果有未提交的更改,我想不要执行某些步骤.
指针非常感谢.
为什么不测试结果svn status -q
呢?就像是:
result=`svn status -q`
[ -z "$result" ] && echo "No changes" && exit 1
echo "Changes found"
exit 0
Run Code Online (Sandbox Code Playgroud)
如果您svn:externals
在回购中使用,请参阅下面的注释和答案以了解其他方法.
如果您的项目包含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':
Run Code Online (Sandbox Code Playgroud)
为了解决这个额外的输出,我最终使用了awk
:
if [[ -n $(svn status -q . | awk '$1 ~ /[!?ABCDGKLMORST]/') ]]; then
echo "The working copy at $(pwd) appears to have local modifications"
fi
Run Code Online (Sandbox Code Playgroud)
此脚本获取输出svn status -q
并过滤掉所有不以指示本地更改的状态代码开头的行。如果最终结果是空字符串,则工作副本是干净的。
我不久前已经实现了类似的东西。您不应依赖 的返回值svn status
,而应解析其输出。例如,您应该查找以“M”、“A”、“D”等开头的行。您可以使用perl来帮助您完成此操作。根据解析的结果,您肯定会知道是否有变化。
svn status
顺便说一句,如果没有更改,返回 0是不正常的- 毕竟这个返回代码只是表示没有发生错误。