SVN:如何检查目录的存在,没有错误消息,但有密码对话框?

SVN:如何检查目录的存在,没有错误消息,但有密码对话框?,svn,Svn,我有一个SVN回购URL,如http://svn/project/trunk/directory。如何测试存储库中是否存在该目录,从而抑制错误消息?它在Linux上的SVN命令行客户端脚本中运行。我可以使用svn ls URL或svn info URL进行测试,并检查返回值。但如果URL不存在,则会显示错误消息: svn: warning: W170000: URL 'http://svn/project/trunk/directory' non-existent in revision 118

我有一个SVN回购URL,如
http://svn/project/trunk/directory
。如何测试存储库中是否存在该目录,从而抑制错误消息?它在Linux上的SVN命令行客户端脚本中运行。我可以使用
svn ls URL
svn info URL
进行测试,并检查返回值。但如果URL不存在,则会显示错误消息:

svn: warning: W170000: URL 'http://svn/project/trunk/directory' non-existent in revision 11853
svn: E200009: Could not display info for all targets because some targets don't exist
如果发生这种情况,脚本也可以,因此我想抑制消息。但信息是标准错误。我无法将标准错误重定向到/dev/null,因为如果用户第一次访问repo,可能会出现密码对话框。一个--quiet选项是完美的,但它不受支持。我可以对父目录执行
svnls
,但这可能不存在。脚本不应假设SVN repo根目录,例如URL
http://server/data/projects/svn/project/trunk/directory
回购根目录为
http://server/data/projects/svn/project
,因此我无法
svn ls
从repo根目录下到目录。如果涉及到许多层次结构,那么这也会很耗时。其他想法

编辑:密码对话框以前是标准错误(至少在1.4之前),但现在(至少从1.6开始)密码对话框将输出定向到/dev/tty(如果不在Windows下,并且/dev/tty可用)


Edit2:实际密码对话框不是1.6版的标准错误,但要求以纯文本形式存储密码的对话框仍然是。因此1.6的标准误差不能被丢弃。1.8在/dev/tty上有两个对话框。

这实际上对我很有用:

if svn --username qazwart ls http://svn.vegicorp.com/repo/project/dir > /dev/null 2>&1
then
    echo "It exists"
else
    echo "It doesn't"
fi
我仍然会收到输入密码的提示,但我没有看到列表或错误消息

我在一台运行10.10的Mac电脑上,使用的是SVN版本1.7.17。你试过这个吗?如果它不起作用,了解您的操作系统和SVN版本会很有趣

如果这对您不起作用,您可能需要提前询问密码,然后测试:

read -p"Password for '$username': " password
[[ $password ]] && password="--password $password"
if svn --username $username $password \
        ls http://svn.vegicorp.com/repo/project/dir > /dev/null 2>&1
then
    echo "It exists"
else
    echo "It doesn't"
fi

查看
--非交互式
选项。密码提示在使用时被抑制。@PatrickQuirk听起来与问题的要求相反(抑制错误消息,但不抑制出现的密码提示)。@AndrewMedico啊,你说得对,它在标题中@PatrickQuirk我需要密码对话框才能访问回购协议,我无法抑制它。我前一段时间尝试过这个,但它不起作用,密码对话框在stderr上。这就是为什么我有“从不重定向SVN标准错误”规则。这至少对SVN 1.4.2有效。但是,在SVN 1.6和1.8中,这是不同的,它可以放弃stderr,密码对话框仍然存在。是时候放弃我的规则了。选项--username/--password不是必需的。对于SVN 1.6,“保存纯文本密码”对话框仍然是标准错误,因此不能丢弃它,并且我的“从不重定向SVN标准错误”规则仍然为真。