在Azure DevOps存储库中检查另一个项目中的子模块

7

我正在尝试从Azure DevOps中的另一个项目中检出子模块。

steps:

- checkout: self
  submodules: true
  persistCredentials: true
  clean: true

在同一项目中检出另一个存储库是可行的。

目标

将存储库A作为子模块添加到存储库B中。

Projects

然而,我遇到了错误:

Cloning into 'E:/build/Agent5/_work/16/s/.azuredevops'...
fatal: could not read Username for 'https://dev.azure.com': terminal prompts disabled
fatal: clone of 'https://dev.azure.com/ORGANIZATION/PROJECTA/_git/REPOSITORYA' into submodule path 'E:/build/Agent5/_work/16/s/.azuredevops' failed

我应该怎样在Azure DevOps Repositories中使用YAML实现这个目标?
5个回答

10
在项目设置中(左侧菜单底部),默认勾选了“限制作业授权”选项。将其关闭可解决问题。

Project setting pane, option that solved issue

我刚刚在yaml文件中的steps:下添加了以下内容,供您参考:

- checkout: self
  submodules: true

5

当我添加一个子模块时,发现.gitmodules文件中的URL不正确。

path = .azuredevops
url = https://dev.azure.com/ORGANIZATION/PROJECTA/_git/REPOSITORYA

应该是:

path = .azuredevops
url = https://ORGANIZATION@dev.azure.com/ORGANIZATION/PROJECTA/_git/REPOSITORYA

嘿@Bruno,我在哪里可以找到.gitmodules并更新路径?我没有使用子模块:true。 - Naveen Kumar
嘿@NaveenKumar,子模块只会在你添加子模块后才会出现。如果您已经添加了它,则应该在存储库根目录中的隐藏文件中。如果它没有出现,请尝试在Windows文件夹中选择显示隐藏文件选项。 - BrunoMartinsPro
1
有趣的是,第一个在本地可以工作,但只有第二个可以在Azure服务器上工作。 :-/ - Eike
@BrunoMartinsPro 我知道你发表这个答案已经过去了好几年,但我很想了解你是如何发现这个的。 - Stephan B

3

我在组织级别关闭了“限制作业授权范围”的设置,但仍被阻止。事实证明,您还需要为每个独立项目关闭它。这不会被继承。


我很欣赏你的用户名 :P - undefined

2
我认为这意味着Pipeline在B项目中无法访问B仓库。但我不认为文档说可以跨项目(尽管我注意到有几个地方说的是同一个Azure DevOps组织,而不是同一个项目),但可能可以,你可以按照此链接操作:

https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/pipeline-options-for-git?view=azure-devops#authenticated-submodules

如果那样不起作用,您需要使用脚本方法获取PAT令牌并将其用于结帐:

https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/pipeline-options-for-git?view=azure-devops#alternative-to-using-the-checkout-submodules-option


0

假设您的所有存储库都在同一组织中,并且没有策略或安全性阻止在项目之间检出存储库,那么您可以通过以下两种方式实现

1. 使用git submodule update

在此方法中,我们使用System.AccessToken.gitmodules文件中指定的https存储库进行身份验证。 顺便说一句,所有子模块必须在HTTPS上!

pool :
    vmImage : "ubuntu-latest"

stages :
  - stage : Build
    jobs :
      - job : Build
        steps :
          - script: |
              git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" \
                  submodule update --init --recursive
            displayName: Fetch Submodules

2. 使用repositories任务

下面的管道将检出存储库并将它们挂载到路径位置。路径/s很重要,因为它将把repo检出到代码工作目录中,如果项目A文件系统包含libs/repo-one/libs/RepoTwo/路径, 那么项目B的源代码将被挂载在那里。

pool :
  vmImage : "ubuntu-latest"

resources:
  repositories:
  - repository: repo-one
    name: Project B/repo-one
    type: git
 
  - repository: RepoTwo
    name: Project B/Repo Two
    type: git
  
stages :
  - stage : Build
    jobs :
      - job : Build
        steps :
          # Project A
          - checkout: self
            submodules: false
            path: "s/"
          # Project B
          - checkout: repo-one
            path: "s/libs/repo-one/"
          - checkout: RepoTwo
            path: "s/libs/RepoTwo/"
          
          - script: |
              ls -la .
              ls -la libs/repo-one
              ls -la libs/RepoTwo
            displayName: Debug File System

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