【问题标题】:VSTS Build : Git submodule automatizationVSTS Build:Git 子模块自动化
【发布时间】:2017-08-22 14:33:06
【问题描述】:

我们从 TFS 切换到 GIT。 每次启动新版本时,我们都会尝试更新子模块。

我们遵循了本指南:https://www.visualstudio.com/en-us/docs/build/scripts/git-commands#enable

我们在第 49 行有一个错误。

我们认为实际上我们需要进行身份验证。但我们不确定。 我们使用: git pull 并且它有效 但是当我们这样做时:git submodule foreach git pull origin master。 我们收到“正在输入”的消息,但没有任何反应

有人已经有这个问题了吗?你是怎么解决的?

【问题讨论】:

  • 子模块 git repo 托管在哪里,VSTS 或 github 上的相同帐户等?如果您将 powershell 任务 与两行脚本一起使用会怎样:cd <submodule folder>git push origin master
  • 它们托管在同一个 VSTS 帐户上。实际上我们想使用这个命令:git submodule foreach git pull origin master。而且你真的不知道为什么它不起作用。

标签: git azure-devops azure-pipelines


【解决方案1】:

这是一个身份验证问题。您需要将 OAuth 令牌放入每个子模块存储库中。

确保您已启用构建定义设置以允许脚本访问 OAuth 令牌。如文档所述,这会将令牌填充到名为 System.AccessToken 的变量中。它还将令牌填充到 git config 设置中,当您在启用设置后运行它时,您将在获取源步骤结束时看到该设置。这就是 git 向 VSTS 进行身份验证的方式。您需要为每个 repos 构建一个配置语句,并且您需要 cd 进入该子模块以在该 repo 中发布它。

这是我使用的 Powershell 脚本:

$mods = (git submodule status) | % { ($_.Trim() -split " ")[1] }
$baserepo = ($env:BUILD_REPOSITORY_URI).TrimEnd($env:BUILD_REPOSITORY_NAME)
foreach($mod in $mods)
{
cd $mod
$cmd = 'git config http.' + $baserepo + $mod + '.extraheader "AUTHORIZATION: bearer ' + $env:System_AccessToken + '"'
write $cmd
iex $cmd
cd ..
}

然后运行 ​​cmd 或 powershell 步骤:

git submodule update --remote

最后,您应该在使用完令牌后清理它,这样 OAuth 就不会在您的构建代理上的 .git/config 文件中挂起:

$mods = (git submodule status) | % { ($_.Trim() -split " ")[1] }
$baserepo = ($env:BUILD_REPOSITORY_URI).TrimEnd($env:BUILD_REPOSITORY_NAME)
foreach($mod in $mods)
{
cd $mod
$cmd = 'git config --unset-all http.'+ $baserepo + $mod + '.extraheader'
write $cmd
iex $cmd
cd ..
}

【讨论】:

  • 这是一个很棒的解决方法。注意 TrimEnd 可能是错误的调用(可能使用 Replace?) - TrimEnd 采用字符数组而不是字符串并修剪 any 这些字符。
【解决方案2】:

这似乎是由 VSTS 使用带有子模块的 git 命令构建句柄的方式引起的。

我发了VSTS build hang up when execute git commands related to git submoudle,你可以关注这个问题。

顺便说一句,对于 OAuth,您可以在 .gitmodules 中添加凭据。

【讨论】:

  • 看起来像我们的问题。这和我们一样。我会跟进你的帖子,希望有办法解决这个问题。谢谢:)
【解决方案3】:

刚刚通过谷歌搜索找到了这个 Q/A: 您可以使用相对路径,例如:

origin  ssh://USERNAME@vs-ssh.visualstudio.com:22/PROJECT/_ssh/REPO (fetch)

.gitmodules 可以包含:

[submodule "SUBMODULE"]
    path = SUBMODULE
    url = ../SUBMODULE

Source

祝你有美好的一天:)

【讨论】:

    【解决方案4】:

    在您的 .gitmodules 文件中,您可以尝试在 url 中添加组织名称(区分大小写)

    [submodule "MySubModule"]
    path = MySubModule
    url = https://<Organization Name>@dev.azure.com/<Organization Name>/_git/<Project Name>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多