Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

本文介绍如何将现有 Git 存储库从 GitHub、Bitbucket、GitLab 或其他位置导入到 Azure DevOps 项目中的新或空现有存储库中。

如果使用 TFS 2017.1 将 GitHub 存储库导入到 TFS 2018.1, 则导入存储库 功能当前不起作用。 有关此问题的详细信息,请参阅 弱加密标准删除通知 并且由于 TLS 1.2 仅更改而无法连接到 GitHub

此问题有几种解决方法:

  • 可以使用本文后面提供的步骤将 GitHub 存储库导入 Azure Devops, 使用 git CLI 手动导入存储库

  • 可以在应用程序层服务器上设置计算机范围的 .NET 注册表项,使其能够使用所有可用的 TLS 协议版本。 设置这些注册表项后,需要 (回收 TFS 应用程序池,或重启服务器) 以激活设置。 打开提升的命令提示符并运行以下命令来设置注册表项。

     reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
     reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
    
  • 在应用程序层服务器上,可以修改web.config文件以将 targetFramework 从 <httpRuntime targetFramework="4.5"<httpRuntime targetFramework="4.6"更改为 。

    此问题从 Team Foundation Server 2018 Update 2 RC1 及更高版本开始得到解决。

  • Azure DevOps 中的组织。 如果没有,可以免费 注册 一个。 每个组织都包含免费、无限制的专用 Git 存储库。
  • 若要创建或导入存储库,你必须是项目管理员安全组的成员,或者将 Git 项目级 创建存储库 权限设置为 “允许”。 若要了解详细信息,请参阅 设置 Git 存储库权限
  • 若要使用 Azure DevOps 导入存储库 功能,必须具有 TFS 2017 Update 1 或更高版本。
  • 若要使用 TFS 2017 RTM 或更早版本导入存储库,请参阅 使用 git CLI 手动导入存储库
  • 如果要使用 az repos 命令,请务必遵循 Azure DevOps CLI 入门中的步骤。
  • Azure DevOps 中的组织。 如果没有,可以免费 注册 一个。 每个组织都包含免费、无限制的专用 Git 存储库。
  • 若要创建或导入存储库,你必须是项目管理员安全组的成员,或者将 Git 项目级 创建存储库 权限设置为 “允许”。 若要了解详细信息,请参阅 设置 Git 存储库权限
  • 若要使用 Azure DevOps 导入存储库 功能,必须具有 TFS 2017 Update 1 或更高版本。
  • 若要使用 TFS 2017 RTM 或更早版本导入存储库,请参阅 使用 git CLI 手动导入存储库
  • 导入到新存储库

  • 选择 “存储库”, “文件”。

  • 从存储库下拉列表中选择 “导入存储库”。

  • 如果源存储库公开可用,只需输入源存储库的 克隆 URL 和新 Git 存储库的名称。

    如果源存储库是专用存储库,但可以使用基本身份验证 (用户名-密码、个人访问令牌等) 访问,请选择 “需要授权 ”并输入凭据。 不支持 SSH 身份验证,但可以按照 Git CLI 手动导入存储库中的步骤,手动导入使用 SSH 身份验证的存储库。

    如果源存储库公开可用,只需输入源存储库的 克隆 URL 和新 Git 存储库的名称。

    如果源存储库是专用存储库,但可以使用基本身份验证 (用户名-密码、个人访问令牌等) 访问,请选择 “需要授权 ”并输入凭据。 不支持 SSH 身份验证,但可以按照 Git CLI 手动导入存储库中的步骤,手动导入使用 SSH 身份验证的存储库。

    导入到现有的空存储库

    在空 Git 存储库的 “文件” 页上,选择“ 导入 ”并 输入克隆 URL。 如果源存储库需要身份验证,则需要提供凭据。

    导入功能禁用提交注释中提到的工作项的自动链接,因为目标项目中的工作项 ID 可能与源项目中的工作项 ID 不同。 可以通过导航到“设置”、“版本控制”、“选择存储库”和“选项”来重新启用提交中提到的工作项的自动链接。 有关将提交与工作项链接的详细信息,请参阅 将工作项链接到提交

    使用 az repos CLI 手动导入存储库

    可以使用 az repos import 将存储库导入到 Azure DevOps 项目。

    必须先在 Azure DevOps 中创建存储库,然后才能导入 Git 存储库。 此外,创建的存储库必须为空。 若要创建存储库,请参阅在 Azure Repos 中创建 Git 存储库

    az repos import create --git-source-url
                           [--detect {false, true}]
                           [--git-service-endpoint-id]
                           [--org]
                           [--project]
                           [--repository]
                           [--requires-authorization]
                           [--subscription]
                           [--user-name]
    org, organization
    Azure DevOps 组织 URL。 You can configure the default organization by using az devops configure -d organization=<ORG_URL>. 如果未配置为默认配置或通过 git 配置进行选取,则为必需。示例: https://dev.azure.com/MyOrganizationName/.
    project, p
    项目的名称或 ID。 可以使用 .. 配置默认项目 az devops configure -d project=<NAME_OR_ID>。 如果未配置为默认配置或通过 git 配置进行选取,则为必需repository
    要在其中创建导入请求的存储库的名称或 ID。
    requires-authorization
    用于指示源 git 存储库是否为专用的标志。 如果需要身份验证,请在源存储库上生成身份验证令牌,并将环境变量 AZURE_DEVOPS_EXT_GIT_SOURCE_PASSWORD_OR_PAT 设置为令牌的值。 然后,导入请求将包括身份验证。
    subscription
    订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
    user-name
    指定 git 存储库专用时的用户名。
    

    以下命令将公共存储库 fabrikam-open-source 导入到默认配置的az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"空 Git 存储库 fabrikam-open-source

    az repos import create --git-source-url https://github.com/fabrikamprime/fabrikam-open-source --repository fabrikam-open-source
      "detailedStatus": {
        "allSteps": [
          "Processing request",
          "Analyzing repository objects",
          "Storing objects",
          "Storing index file",
          "Updating references",
          "Import completed successfully"
        "currentStep": 6,
        "errorMessage": null
      "importRequestId": 8,
      "parameters": {
        "deleteServiceEndpointAfterImportIsDone": null,
        "gitSource": {
          "overwrite": false,
          "url": "https://github.com/fabrikamprime/fabrikam-open-source"
        "serviceEndpointId": null,
        "tfvcSource": null
      "repository": {
        "defaultBranch": null,
        "id": "0f6919cd-a4db-4f34-a73f-2354114a66c4",
        "isDisabled": false,
        "isFork": null,
        "name": "new-empty-repo",
        "parentRepository": null,
        "project": {
          "abbreviation": null,
          "defaultTeamImageUrl": null,
          "description": "Guidance and source control to foster a vibrant ecosystem for Fabrikam Fiber applications and extensions.",
          "id": "56af920d-393b-4236-9a07-24439ccaa85c",
          "lastUpdateTime": "2021-05-24T21:52:14.95Z",
          "name": "Fabrikam Fiber",
          "revision": 438023732,
          "state": "wellFormed",
          "url": "https://dev.azure.com/fabrikamprime/_apis/projects/56af920d-393b-4236-9a07-24439ccaa85c",
          "visibility": "private"
        "remoteUrl": "https://fabrikamprime@dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_git/fabrikam-open-source",
        "size": 12477,
        "sshUrl": "git@ssh.dev.azure.com:v3/kelliott/Fabrikam%20Fiber/new-empty-repo",
        "url": "https://dev.azure.com/fabrikamprime/56af920d-393b-4236-9a07-24439ccaa85c/_apis/git/repositories/0f6919cd-a4db-4f34-a73f-2354114a66c4",
        "validRemoteUrls": null,
        "webUrl": "https://dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_git/fabrikam-open-source"
      "status": "completed",
      "url": "https://dev.azure.com/fabrikamprime/Fabrikam%20Fiber/_apis/git/repositories/0f6919cd-a4db-4f34-a73f-2354114a66c4/importRequests/8"
    

    使用 git CLI 手动导入存储库

    导入存储库功能是在 TFS 2017 Update 1 中引入的。 如果使用 TFS 2017 RTM 或更早版本,可以使用以下步骤手动将存储库导入 TFS。 还可以按照以下步骤手动将存储库导入Azure DevOps Services存储库,方法是将 TFS 替换为以下步骤中的Azure Repos。

  • 使用 bare 此选项将源存储库克隆到计算机上的临时文件夹,如以下命令行示例所示,然后导航到存储库的文件夹。 使用 bare 此选项克隆时,文件夹名称包括 .git 后缀。 在此示例中, https://github.com/contoso/old-contoso-repo.git 是要手动导入的源存储库。

    git clone --bare https://github.com/contoso/old-contoso-repo.git
    cd old-contoso-repo.git
    
  • 使用 TFS 2017 RTM 创建目标存储库,并记下克隆 URL。 在此示例中, https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo 是新目标存储库的 URL。

  • 运行以下命令,将源存储库复制到目标存储库。

    git push --mirror https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    

    使用 --mirror 将覆盖目标存储库中的所有分支,其中包括删除源存储库中不包含的任何分支。

  • 如果源存储库具有 LFS 对象,则提取它们,并将其从源存储库复制到目标存储库。

    git lfs fetch origin --all
    git lfs push --all https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    
  • 运行以下命令删除临时文件夹。

    cd ..
    rm -rf old-contoso-repo.git
    

    尽管大多数情况下导入成功,但以下条件可能会导致问题。

  • 如果我的源存储库落后于双重身份验证,该怎么办?
  • 如果我的源存储库不支持multi_ack,该怎么办?
  • 是否可以从早期版本的 Team Foundation Server 导入?
  • 是否可以使用基于 MSA 的凭据?
  • 是否可以从 TFVC 导入?
  • 如果源存储库包含 Git LFS 对象,该怎么办?
  • 如果我的源存储库落后于双重身份验证,该怎么办?

    导入服务使用 REST API 来验证和触发导入,并且不能直接使用需要双重身份验证的存储库。 大多数 Git 托管提供商(如 GitHub)和Azure DevOps Services支持可提供给导入服务的个人令牌。

    如果我的源存储库不支持multi_ack,该怎么办?

    导入服务在导入过程中使用 Git 协议的 multi_ack 功能。 如果源存储库不提供此功能,则导入服务可能无法从给定源导入。 创建导入请求或导入正在进行时,可能会发生此失败。

    是否可以从早期版本的 Team Foundation Server 导入?

    如果源 Git 存储库位于早于 TFS 2017 RTM 的 TFS 版本中,则导入将失败。 这是因为最新的 Azure DevOps Services/TFS 与 2017 年早期 RTM 版本的 TFS 之间的协定不匹配。

    是否可以使用基于 MSA 的凭据?

    遗憾的是,MSA (Microsoft 帐户,以前基于 Live ID) 的凭据将不起作用。 导入服务依赖于基本身份验证来与源存储库通信。 如果使用的用户名/密码不是基本身份验证,身份验证将失败,导入将失败。 检查所使用的用户名/密码是否为基本身份验证的一种方法是尝试使用 Git 克隆存储库,格式如下

    git clone https://<<username>>:<<password>>@<<remaining clone Url>>
    

    是否可以从 TFVC 导入?

    可以将代码从现有 TFVC 存储库迁移到同一帐户中的新 Git 存储库。 迁移到 Git 具有许多好处,但对于大型 TFVC 存储库和团队来说,这是一个涉及的过程。 集中式版本控制系统(如 TFVC)的行为与 Git 在基本方面的行为不同。 此开关比学习新命令要多得多。 这是一项中断性变更,需要仔细规划。 有关详细信息,请参阅 从 TFVC 导入 Git

    如果源存储库包含 Git LFS 对象,该怎么办?

    Git 导入不会导入 Git LFS 对象。

    可以使用以下步骤移动 LFS 对象:

  • 使用导入存储库功能将存储库导入 Azure DevOps。 这会从源复制到 Azure DevOps 的所有 Git 对象, (这也将导入 LFS 指针,这些指针是 Git 对象,但不是 LFS 文件)
  • 若要在 LFS 文件中移动 (需要在同一框中Git.exe和 LFS 客户端,以及访问源存储库和目标存储库)

  • 将导入的存储库从 Azure DevOps 克隆到本地系统,但执行 LFS 文件签出时会失败
  • 将源存储库添加为远程 (说“source”)
  • 执行 git lfs fetch source --all (此操作会将源中的所有 LFS 文件引入本地存储库)
  • 假设目标 VSTS 存储库是“目标”远程存储库
  • 执行 git lfs push target --all
  • 如果源以后发生更改,是否可以导入更新?

    导入服务最初用于导入整个存储库。 若要镜像以后的更改,需要将远程数据库设置为源和目标的存储库的本地克隆。

    可以使用以下命令同步更改。 我们将Azure Repos导入视为origin原始存储库upstream

    git clone --bare <Azure-Repos-clone-URL>
    cd <name-of-repo>
    git remote add --mirror=fetch upstream <original-repo-URL>
    git fetch upstream --tags
    git push origin --all
    

    Git 存储库的新增功能? 了解更多

  • 在 Git 教程中详细了解 Git
  •