You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何克隆Azure项目所有代码仓库?脚本公钥认证失败求解决

问题

我需要克隆Azure项目中所有现有代码仓库以执行搜索操作,尝试了以下Bash脚本:

#!/bin/bash
ORGANIZATION="abc"
PROJECT="cdf"
PAT="fgh"

az devops login --organization "https://dev.azure.com/$ORGANIZATION"

REPOS=$(curl -s -H "Authorization: Basic $(echo -n :$PAT | base64)" \
  "https://dev.azure.com/$ORGANIZATION/$PROJECT/_apis/git/repositories?api-version=6.0" \
  | jq -r '.value[].sshUrl')


for REPO in $REPOS; do
  git clone $REPO
done

但所有克隆尝试均出现以下错误:

Please make sure you have the correct access rights
and the repository exists.
Cloning into 'some-repo'...
remote: Public key authentication failed.
fatal: Could not read from remote repository.

我使用的PAT是正确的,今日还通过它克隆仓库并提交代码。请问我哪里操作有误?或者有什么其他可行方案?

问题原因与解决方案
  • 核心问题:脚本获取的是仓库的sshUrl,SSH克隆依赖本地SSH密钥对验证,和你用来认证的PAT无关,因此出现公钥认证失败的错误。你之前用PAT成功克隆的操作,应该是使用了HTTPS地址。

  • 修正方案1:改用HTTPS地址克隆
    修改API请求中提取的字段为remoteUrl(HTTPS格式地址),并将PAT嵌入到HTTPS链接中完成认证:

    #!/bin/bash
    ORGANIZATION="abc"
    PROJECT="cdf"
    PAT="fgh"
    
    az devops login --organization "https://dev.azure.com/$ORGANIZATION"
    
    # 提取HTTPS格式的仓库地址
    REPOS=$(curl -s -H "Authorization: Basic $(echo -n :$PAT | base64)" \
      "https://dev.azure.com/$ORGANIZATION/$PROJECT/_apis/git/repositories?api-version=6.0" \
      | jq -r '.value[].remoteUrl')
    
    for REPO in $REPOS; do
      # 将PAT插入到HTTPS链接的用户名位置
      REPO_WITH_PAT=$(echo "$REPO" | sed "s|https://|https://$PAT@|")
      git clone "$REPO_WITH_PAT"
    done
    
  • 修正方案2:配置SSH密钥后使用SSH克隆
    如果坚持使用SSH方式,需在Azure DevOps中配置本地SSH公钥:

    1. 生成本地SSH密钥对(无密钥时执行):ssh-keygen -t ed25519 -C "your-email@example.com"
    2. 复制公钥内容(默认路径为~/.ssh/id_ed25519.pub)
    3. 登录Azure DevOps,进入「用户设置」→「SSH公钥」→「添加」,粘贴公钥并保存
      完成配置后运行原脚本即可正常克隆。
  • 替代方案:使用Azure CLI直接操作
    跳过curl和jq,用Azure CLI的az repos list命令获取仓库信息,更简洁可靠:

    #!/bin/bash
    ORGANIZATION="abc"
    PROJECT="cdf"
    PAT="fgh"
    
    # 用PAT登录Azure CLI
    az devops login --organization "https://dev.azure.com/$ORGANIZATION"
    
    # 设置默认组织和项目
    az devops configure --defaults organization=https://dev.azure.com/$ORGANIZATION project=$PROJECT
    
    # 获取所有仓库的HTTPS地址并克隆
    az repos list --query "[].remoteUrl" -o tsv | while read REPO; do
      REPO_WITH_PAT=$(echo "$REPO" | sed "s|https://|https://$PAT@|")
      git clone "$REPO_WITH_PAT"
    done
    

内容的提问来源于stack exchange,提问作者Diego L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:07:07