【问题标题】:VSTS git build fails with git submoduleVSTS git build 因 git 子模块而失败
【发布时间】:2016-08-03 20:02:30
【问题描述】:

我在 Visual Studio 团队服务项目中有一个 git repos A 和 B。 B 是 A 的子模块,在 .gitmodules 中有以下配置:

[submodule "my_submodule"]
    path = somefolder/my_submodule
    url = https://xxx.visualstudio.com/xxx/_git/B

如果我使用 Repository/Checkout Submodules 选项进行构建,我会收到以下错误:

Repository type=TfsGit
localPath=C:\a\1\s
clean=False
sourceBranch=refs/heads/submoduletest
sourceVersion=0378dd86db31e4d7bff8de86a482b3d8e72dd3ba
Syncing repository: A (Git)
repository url=https://xxx.visualstudio.com/_git/A
checkoutSubmodules=True
Starting clone
Checking out 0378dd86db31e4d7bff8de86a482b3d8e72dd3ba to C:\a\1\s with submodules
Checked out branch refs/heads/submoduletest for repository A at commit 0378dd86db31e4d7bff8de86a482b3d8e72dd3ba
##[error]LibGit2Sharp.NotFoundException: Failed to resolve path 'C:/a/1/s/xxx/somefolder/my_submodule/.git': The system cannot find the path specified.
##[error]   at LibGit2Sharp.Core.Ensure.HandleError(Int32 result)
##[error]   at LibGit2Sharp.SubmoduleCollection.Update(String name, SubmoduleUpdateOptions options)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.DoUpdateSubmodules(Repository repository, Int32 maxRecursionDepth, Int32 currentRecursionDepth, String username, String password, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.UpdateSubmodules(ITaskEndpoint endpoint, Repository repository, Int32 maxRecursionDepth, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.SyncAndCheckout(Boolean cleanRepository, String sourceBranch, String sourceVersion, Boolean checkoutSubmodules, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Plugin.Build.GitSourceProvider.<>c__DisplayClass3_0.<PrepareRepositoryAsync>b__0()
##[error]Microsoft.TeamFoundation.DistributedTask.Agent.Common.AgentExecutionTerminationException: Prepare repository failed with exception. ---> LibGit2Sharp.NotFoundException: Failed to resolve path 'C:/a/1/s/xxx/somefolder/my_submodule/.git': The system cannot find the path specified.
##[error]   at LibGit2Sharp.Core.Ensure.HandleError(Int32 result)
##[error]   at LibGit2Sharp.SubmoduleCollection.Update(String name, SubmoduleUpdateOptions options)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.DoUpdateSubmodules(Repository repository, Int32 maxRecursionDepth, Int32 currentRecursionDepth, String username, String password, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.UpdateSubmodules(ITaskEndpoint endpoint, Repository repository, Int32 maxRecursionDepth, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Task.Internal.Core.GitHelper.SyncAndCheckout(Boolean cleanRepository, String sourceBranch, String sourceVersion, Boolean checkoutSubmodules, CancellationToken cancellationToken)
##[error]   at Microsoft.TeamFoundation.DistributedTask.Plugin.Build.GitSourceProvider.<>c__DisplayClass3_0.<PrepareRepositoryAsync>b__0()
##[error]   --- End of inner exception stack trace ---
##[error]   at Microsoft.TeamFoundation.DistributedTask.Plugin.Build.GitSourceProvider.<>c__DisplayClass3_0.<PrepareRepositoryAsync>b__0()
##[error]   at System.Threading.Tasks.Task.Execute()

有趣的错误信息似乎是:

LibGit2Sharp.NotFoundException: Failed to resolve path 'C:/a/1/s/xxx/somefolder/my_submodule/.git'

在我的机器上做一个 git clone xxx/A --recursive 工作。

fantastic 文档指出了一个身份验证问题: https://www.visualstudio.com/en-us/docs/build/define/repository

但这并没有说明身份验证,即使在 .gitmodules 中使用相对路径也不会导致不同的错误消息。

有什么想法吗?

更新 1

出于测试目的,我使用了一个分支。我将更改(添加子模块)合并到 master 并重试 - 现在出现以下错误:

##[error]LibGit2Sharp.NotFoundException: Object not found - no matching loose object (4fa408bc7b29e87b7032e0f78998516ff4a4da00)

该哈希是我的子模块的 HEAD - 显然可用。

【问题讨论】:

标签: git azure-devops git-submodules


【解决方案1】:

@eddie-msft 的评论是正确的:master 上有一个同名的文件夹。结帐到我的测试分支并没有删除该文件夹。虽然这在我在本地执行时有效,但 VS Team Services 似乎对此有问题。

但还有另一个问题:与文档相反,我愿意提供子模块的完整 url (https://xxx.visualstudio.com/xxx/_git/B)。文档说明我应该使用相对 url(../B 或 ../../B - 这是一个猜谜游戏),但这不起作用。

【讨论】:

    【解决方案2】:

    您的 .gitmodules 文件存在一些问题。通常,文件中的路径应该是您的子模块存储库名称(在您的场景中为“B”)。

    【讨论】:

    • 没必要,我使用了 $ git submodule add 以便在文件夹“somefolder/my_submodule”中签出子模块。在我的机器上工作。
    • @kuechlerm 那么您可能需要尝试使用相对路径:visualstudio.com/en-us/docs/build/define/…
    • @kuechlerm 可以检查“somefolder”文件夹中是否有“my_submodule”文件与 VSTS Web Portal 的 Repo A 中的“path = somefolder/my_submodule”匹配?该错误也可能是由于文件在存储库中被删除。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2012-09-14
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2018-08-17
    相关资源
    最近更新 更多