在Windows 7中使用GIT BASH时出现Groovy引导错误

3

我正在调用一个git hook来执行pre-commit操作。这将触发一个对groovy脚本的调用,并以允许远程调试hook执行的方式进行。就像这样:

#!/usr/bin/env groovy
groovy -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=8085,suspend=y "C:\Users\.......hooks\PreCommit.groovy"

当我使用GIT BASH触发钩子时,出现以下错误:
/c/Program Files (x86)/Groovy/Groovy-2.1.0/bin/startGroovy: line 96: [: too many arguments org.codehaus......: startup failed: .... expected EOF, found ':' @ line 3 column 35]

当我快速查看startGroovy文件时,我看到以下不清晰的代码 - 其中第96行是带有GROOVY home的if条件语句:
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
  [ -n "$GROOVY_HOME" ] && GROOVY_HOME=`cygpath --unix "$GROOVY_HOME"`
  [ -n "$JAVACMD" ] && JAVACMD=`cygpath --unix "$JAVACMD"`
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CP" ] && CP=`cygpath --path --unix "$CP"`
else
  if [ -n "$GROOVY_HOME" -a `expr "$GROOVY_HOME":'\/$'` ] ; then
      GROOVY_HOME=`echo $GROOVY_HOME | sed -e 's/\/$//'`
  fi
fi

这是Groovy引导程序的一个错误吗?我在Windows 7上设置了GROOVY_HOME环境变量,正确指向:C:\program file (x86)\Groovy\Groovy-2.1.0。

2个回答

4
问题在于Groovy脚本没有正确地引用环境变量GROOVY_HOME。在GROOVY_HOME路径中的空格(我的情况下为“Program Files (x86)”有两个空格)被解释为分隔符,从而导致路径被解析为多个参数。要解决这个问题,需要将Windows环境变量GROOVY_HOME的定义更改为使用路径的波浪线版本。编辑您的环境变量GROOVY_HOME(在Vista上,开始/右键单击计算机/属性/高级系统设置/环境变量/用户或系统,我的是系统),并设置为c:/Progra~2/Groovy/Groovy-2.1.3。当您启动Git、MinGW或CygWin shell时,您不会遇到任何错误。

1
Git Bash中缺少cygpath命令,它只实现了一个精简版的cgywin。一种解决方案是为git使用完整的cygwin安装版本,但是可能创建自己的.bashrc文件并使用类Unix的目录名称会更加相似:
# Check to see what the DOS directories are
echo GROOVY_HOME=$GROOVY_HOME
echo JAVACMD=$JAVACMD
echo JAVA_HOME=$JAVA_HOME
echo CP=$CP

# Add the directories you found to .bashrc in a unix style
cat - >>~.bashrc
export GROOVY_HOME='/c/program file (x86)/Groovy/Groovy-2.1.0'
export JAVACMD="..."
export JAVA_HOME="/c/Program files/Java/jre7/bin/java"
export CP= "..."

请根据需要更改路径。您可以使用Notepad++或其他编辑器编辑.bashrc,而不是使用cat。请记住,在Bash中,cat - 命令使用Control-D终止,而DOS复制con file.txt则使用Control-Z。通过将这些变量放置在.bashrc中,它们不会干扰您的DOS环境变量。

那是一个有趣的观察。然而,我刚刚测试了一下,但没有成功。结果发现,if $cygwin 是假的,因此根本不会调用 cygpath,所以错误必须在 if [ -n "$GROOVY_HOME" -a 'expr "$GROOVY_HOME":'\/$'' ] ; then GROOVY_HOME='echo $GROOVY_HOME | sed -e 's/\/$//'' fi 这里。我已经在我的 .bashrc 中插入了 exports,虽然它看起来设置正确,但在 startGroovy 文件中的 echo 将显示 GROOVY_HOME 格式仍为 Windows。 - Jes Chergui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接