Svn 如何确定目录是否是Subversion工作副本的一部分?

Svn 如何确定目录是否是Subversion工作副本的一部分?,svn,Svn,我有一个脚本,可以将一些文件复制到项目中。这样的项目通常是Subversion工作副本,但并不总是如此。如果它是一个工作副本,我想将文件自动添加到Subversion。但是我怎么知道目录是Subversion工作副本的一部分呢?到目前为止,我检查了一个.svn子文件夹,但这不适用于Subversion 1.7。我只需要知道svn添加文件…是否有效,不需要提取其他数据。只需运行svn status。如果不是工作副本,您将收到如下消息: svn: warning: '.' is not a work

我有一个脚本,可以将一些文件复制到项目中。这样的项目通常是Subversion工作副本,但并不总是如此。如果它是一个工作副本,我想将文件自动添加到Subversion。但是我怎么知道目录是Subversion工作副本的一部分呢?到目前为止,我检查了一个.svn子文件夹,但这不适用于Subversion 1.7。我只需要知道
svn添加文件…
是否有效,不需要提取其他数据。

只需运行
svn status
。如果不是工作副本,您将收到如下消息:

svn: warning: '.' is not a working copy
编辑:如果您担心
svn status
的递归性质,您可以通过以下方式限制深度(取决于客户端的版本):


(后一种格式在客户端的最新版本中被列为过时格式)。

您可以使用svn info属性,然后通过管道仅获取url,如下所示:

svn info -R | FIND "URL:" >urlText
然后将此输出加载到另一个变量中,您可以像这样使用它:

set /p urlRepo= <urlText
del urlText

set/p urlRepo=您正在编写一个脚本,因此。。。脚本形式的解决方案:)


该解决方案的更简单版本:

WCBRANCH=`svn info ${WCDIR} 2> /dev/null | wc -l`
if [ ${WCBRANCH} -eq 0 ]
 then
   echo "Error: directory ${WCDIR} exists and is not part of a working copy."
   exit 1
 fi

svn status
不是一个好主意,因为它是一个递归操作,可能需要一些时间。我需要测试正确的非递归选项是什么。消息可能使用不同的语言,这使得解析变得困难。@user909066-我添加了一些关于非递归选项的信息。
--depth=empty
在我的测试用例中返回
a.
。这不是一个空字符串。较旧的客户端返回
svn:无效选项:--depth=empty
。我更喜欢一个更可移植的解决方案。@user909066-有趣的是,我运行了几个测试用例,但从未从
--depth=empty
返回字符串;我会更新文本的。关于兼容性,正如文本中所指出的,从(现在已经过时的)
--非递归
到功能更强大的
--深度=…
。svn的--xml选项旨在保护用户不受输出差异的影响,比如不同的语言环境。我不需要URL。如果不是工作副本,则至少
svn info
提供非零退出状态。但这种退出状态可靠吗?这只是一个例子。。随便挑一个吧。。它应该很好,所以我们的想法是解析一个只有在它是工作副本时才存在的字符串,例如“^URL:”。在这种情况下,不需要选项
-R
。如果目录是较旧SVN版本的工作副本,则在放弃标准错误后会收到“请升级”消息,但${WCBRANCH}仍然为0。这是否适用于SVN客户端可以发出的所有消息?对我来说,这听起来很危险。
set /p urlRepo= <urlText
del urlText
 REPO="http://repository_url"
 WCDIR="dir_you_are_checking"
 WCBRANCH=`svn info ${WCDIR} 2> /dev/null | grep "^URL:" | cut -d" " -f2 | sed s,${REPO}/,,`
 if [ -z "${WCBRANCH}" ]
 then
   echo "Error: directory ${WCDIR} exists and is not part of a working copy."
   exit 1
 fi
 # WCBRANCH will contain the WCDIR path inside repository
WCBRANCH=`svn info ${WCDIR} 2> /dev/null | wc -l`
if [ ${WCBRANCH} -eq 0 ]
 then
   echo "Error: directory ${WCDIR} exists and is not part of a working copy."
   exit 1
 fi