我使用 groovy 编写了一个自定义 gradle 插件来执行基本的 svn 任务,例如 Checkout、Clean、Tag 等。groovy 类调用 svn 命令行客户端来执行这些操作,当我在我的 Windows 系统上运行它时它工作正常但同样当我在 linux 系统 (Centos) 上运行插件时,它会出现以下错误。
svn: E170000: Unrecognized URL scheme for '%22https://source.mycompany.net/svn/MyProject/trunk%22'
我能够通过命令提示符或 shell 脚本对命令行客户端进行相同的调用,而不会出现任何问题。那么和有什么区别
这是我的代码示例:
String command =String.format("svn co -r %d --non-interactive --trust-server-cert -- username %s --password %s --depth infinity \"%s\" \"%s\"",
getRevision(),
getUserName(),
getUserPassword(),
getSrcUrl(),
getDir());
Process svnProcess = Runtime.getRuntime().exec(command);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(svnProcess.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(svnProcess.getErrorStream()));
String statusOutputLine =""
while ((statusOutputLine = stdInput.readLine()) != null)
{
logger.quiet(" " + statusOutputLine);
}
while (( statusOutputLine = stdError.readLine()) != null)
{
logger.error(statusOutputLine)
throw new Exception(statusOutputLine)
}
logger.quiet("Successfully Checked out the work space")
我确实在系统上安装了 NEON
-bash-4.1$ svn --version
svn,版本 1.6.11 (r934486)
编译 2011 年 6 月 25 日,11:30:15
版权所有 (C) 2000-2009 CollabNet。
Subversion 是开源软件,见 http://subversion.tigris.org/
本产品包括由 CollabNet (http://www.Collab.Net/) 开发的软件。
以下存储库访问 (RA) 模块可用:
最佳答案
错误消息似乎很清楚,您传递的 URL 在单引号内。请注意它的前导和尾随 %22
. %22
怎么样"
在 URL 中编码。
问题是您假设您的命令将通过 shell 运行。它不会。所以你的引号变成了传递给命令的文字。相反,任何空格都会被拆分为单独的参数,而不考虑引号。
如果您想控制参数的拆分,您应该生成一个列表而不是单个字符串。
该文档很重要(特别是选项 1 下的 Gotchas 部分):
http://groovy.codehaus.org/Executing+External+Processes+From+Groovy
关于svn - 获取 svn : E170000: Unrecognized URL scheme for my custom Svn Gradle plugin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19732179/