更新子模块时Git on Hudson致命异常

时间:2012-11-19 14:51:39

标签: git github jenkins jenkins-plugins

好的,首先,我对git很新。

我已经设置了一个版本,但它刚刚开始失败,出现以下错误。

FATAL: Command "git submodule update" returned status code 1:
stdout: 
stderr: fatal: reference is not a tree: 72294b9c60128b4495dfe0bf3aa014b3bf1853e9
Unable to checkout '72294b9c60128b4495dfe0bf3aa014b3bf1853e9' in submodule path 'sub/Android-ViewPagerIndicator'

hudson.plugins.git.GitException: Command "git submodule update" returned status code 1:
stdout: 
stderr: fatal: reference is not a tree: 72294b9c60128b4495dfe0bf3aa014b3bf1853e9
Unable to checkout '72294b9c60128b4495dfe0bf3aa014b3bf1853e9' in submodule path 'sub/Android-ViewPagerIndicator'

    at hudson.plugins.git.GitAPI.launchCommandIn(GitAPI.java:838)
    at hudson.plugins.git.GitAPI.launchCommand(GitAPI.java:800)
    at hudson.plugins.git.GitAPI.submoduleUpdate(GitAPI.java:429)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1308)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1269)
    at hudson.FilePath.act(FilePath.java:851)
    at hudson.FilePath.act(FilePath.java:824)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1269)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1325)
    at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676)
    at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581)
    at hudson.model.Run.execute(Run.java:1516)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:236)

2 个答案:

答案 0 :(得分:2)

有人搞砸了你的主项目中的子模块引用。基本上,您的主仓库总是引用子模块仓库中的特定提交,并且提交引用您的子模块(72294b9c60128b4495dfe0bf3aa014b3bf1853e9)似乎不存在。

如果1)有人在子模块项目中进行了检查并且其头部已分离,或者2)子模块项目本身已经以不包含提交的方式进行了更改,则会发生这种情况。

然而,问题应该出现在Hudson之外,无论你是否克隆了你的项目。如果不是,可能只是您的Hudson克隆已损坏,可以删除并重新创建。这也许是可行的。

如果这没有做任何事情并且您确实需要解决问题,请查看this thread以获取解决方案,您也可以通过this blog post了解更多详情。

作为个人观点,子模块很容易破解。如果你是“非常新的git”,你应该避免接触那些,但是首先要用git整体用法弄湿你。

答案 1 :(得分:0)

该线程已有几年历史,但是我遇到了同样的问题,我想分享解决方法。

我的问题与许多人在这里和其他地方提到的缺失提交无关,而是与Hudson / Jenkins的内部有关,即Git数据如何存储在临时工作区目录中:可以访问,则子模块更新将失败。

因此,我的解决方法是在结帐构造扩展名中的RelativeTargetDirectoryCloneOption旁边使用显式SubmoduleOption(此处superproject是项目带有子模块,并且BRANCH_NAME作为环境变量给出):

checkout([
    $class: 'GitSCM',
    branches: [[name: '${BRANCH_NAME}']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [[
        $class: 'RelativeTargetDirectory',
        relativeTargetDir: 'superproject'
    ], [
        $class: 'CleanBeforeCheckout'
    ], [
        $class: 'CloneOption',
        honorRefspec: true, noTags: true, reference: '', shallow: true
    ], [
        $class: 'SubmoduleOption',
        disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false,
        reference: '', trackingSubmodules: false
    ]],
    submoduleCfg: [],
    userRemoteConfigs: [[
        credentialsId: '...',
        url: 'https://.../superproject.git']]
])

作为此步骤的结果,您应该看到在Jenkins / Hudson工作区中,在名为superproject@tmp的主文件夹旁边创建了一个名为superproject的文件夹