在Gradle中获取Git全分支最新标签时命令执行报错求助
解决Groovy中执行Git命令获取最新标签的错误问题
错误原因
- 原命令里
git rev-list后多了个多余的逗号,导致Git无法识别后续参数,触发unknown option错误。 - Groovy的
String.execute()方法默认直接执行命令,不会通过Shell解析语法,因此$(git rev-list ...)这种Shell命令替换会被当成Git的参数,引发异常。
解决方案
方案1:通过Shell执行完整命令
将命令交给bash/sh处理,让Shell解析命令替换语法,同时移除多余的逗号:
def sout = new StringBuilder(), serr = new StringBuilder() def proc = ['bash', '-c', 'git describe --tags $(git rev-list --tags --max-count=1)'].execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout\nerr> $serr"
方案2:分步执行Git命令(更可靠)
拆分命令逻辑,先获取最新标签对应的Commit哈希,再基于该哈希获取标签,避免依赖Shell语法:
def sout = new StringBuilder(), serr = new StringBuilder() // 第一步:获取最新标签的Commit哈希 def revProc = ['git', 'rev-list', '--tags', '--max-count=1'].execute() revProc.consumeProcessOutput(sout, serr) revProc.waitForOrKill(1000) if (!serr.isEmpty()) { println "获取Commit哈希失败: $serr" return } def latestCommit = sout.toString().trim() // 清空输出缓存 sout.setLength(0) serr.setLength(0) // 第二步:根据Commit哈希获取标签 def descProc = ['git', 'describe', '--tags', latestCommit].execute() descProc.consumeProcessOutput(sout, serr) descProc.waitForOrKill(1000) println "out> $sout\nerr> $serr"
内容的提问来源于stack exchange,提问作者Miltent
相关产品推荐
相关产品推荐

