Обновление подмодуля Git на конвейерах с размещенным агентом

У меня есть собственный агент и репозиторий git с подмодулями. URL-адреса в.gitmoduleshttp://

Когда я пытаюсь инициализировать задание, не удается обновить подмодули.

git submodule sync
git submodule update --init --force
Cloning into 'foo-dev-common'...
Submodule 'foo-dev-common' (https://MY_ORG@dev.azure.com/MY_ORG/PInC/_git/foo-dev-common) registered for path 'foo-dev-common'
fatal: could not read Password for 'https://MY_ORG@dev.azure.com': terminal prompts disabled
fatal: clone of 'https://MY_ORG@dev.azure.com/MY_ORG/PInC/_git/foo-dev-common' into submodule path 'foo-dev-common' failed
##[error]Git submodule update failed with exit code: 128
Finishing: Checkout foo-rose-identity-service@submod_bd_mahesh to s/foo-rose-identity-service

Я также попытался добавить репозиторий себя и

    steps:
  - checkout: self
    submodules: true
    persistCredentials: true

2 ответа

Ответ forvaidya не сработал для меня (хотя сейчас 4 года спустя). (Относительные URL в.gitmodules разрешаются в полные URL-адреса в .git/config по git submodule sync.)

persistCredentials: true сохранит заголовок авторизации доступным в git configдля будущих шагов, но он привязан к вашему основному URL-адресу репо. Пока репозиторий подмодулей находится в одной организации, вы можете повторно использовать заголовок, например, в конвейерном скрипте Powershell:

steps:
- checkout: self
  submodules: false
  persistCredentials : true

- powershell: |
    $header = $(git config --get-all http.$(Build.Repository.Uri).extraheader)
    git -c http.extraheader="$header" submodule sync
    git -c http.extraheader="$header" submodule update --init --force --depth=1

(Эти подробности я почерпнул из логов стандартного checkoutшаг. Обратите внимание на ссылку наBuild.Repository.Uri переменная трубопровода.)

Вышеупомянутое позволит выполнить полную ("непрозрачную") проверку основного репо (полезно, например, для GitVersion) без подмодулей и неглубокую проверку любых подмодулей.

Изменить: задокументированный способ получить заголовок авторизации:

    $header = "AUTHORIZATION: bearer $(System.AccessToken)"

После создания относительного пути подмодуля git он работал

url= ../foo-dev-common 

вместо того

url=https://MY_ORG@dev.azure.com/MY_ORG/PInC/_git/foo-dev-common
Другие вопросы по тегам