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

fis*_*rds 12 svn bash

我试图在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

如果有未提交的更改,我想不要执行某些步骤.

指针非常感谢.

AlG*_*AlG 6

为什么不测试结果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在回购中使用,请参阅下面的注释和答案以了解其他方法.

  • 是的,我接受了这个想法并最终得到了类似的东西:[code] if [-z"$(svn st)"]; 然后回声"工作副本是原始的"否则回声"工作副本有变化"退出; fi [/ code] (2认同)

Cod*_*all 5

如果您的项目包含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并过滤掉所有不以指示本地更改的状态代码开头的行。如果最终结果是空字符串,则工作副本是干净的。


Boz*_*sov 2

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

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