匯入 Git 存放庫

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

本文說明如何將現有的 Git 存放庫從 GitHub、Bitbucket、GitLab 或其他位置匯入 Azure DevOps 專案中的新或空白現有存放庫。

必要條件

  • Azure DevOps 中的組織。 如果您沒有帳戶,您可以 免費註冊 一個。 每個組織都包含免費、無限制的私人 Git 存放庫。
  • 若要建立或匯入存放庫,您必須是 Project 管理員 istrators 安全組的成員,或將 Git 專案層級的 [建立存放庫] 權限設定為 [允許]。 若要深入瞭解,請參閱 設定 Git 存放庫許可權
  • 若要使用 Azure DevOps 匯入存放庫 功能,您必須擁有 TFS 2017 Update 1 或更高版本。
  • 若要使用 TFS 2017 RTM 或更早版本匯入存放庫,請參閱 使用 git CLI 手動匯入存放庫。
  • 如果您想要使用 az repos 命令,請務必遵循開始使用 Azure DevOps CLI 中的步驟。
  • Azure DevOps 中的組織。 如果您沒有帳戶,您可以 免費註冊 一個。 每個組織都包含免費、無限制的私人 Git 存放庫。
  • 若要建立或匯入存放庫,您必須是 Project 管理員 istrators 安全組的成員,或將 Git 專案層級的 [建立存放庫] 權限設定為 [允許]。 若要深入瞭解,請參閱 設定 Git 存放庫許可權
  • 若要使用 Azure DevOps 匯入存放庫 功能,您必須擁有 TFS 2017 Update 1 或更高版本。
  • 若要使用 TFS 2017 RTM 或更早版本匯入存放庫,請參閱 使用 git CLI 手動匯入存放庫。

注意

匯入存放庫完成時,Azure DevOps 會 設定該匯入存放庫的預設 分支。 如果匯入的存放庫包含名為 master的分支,則會設定為預設分支,否則匯入存放庫的第一個分支(依字母順序)設定為 Default

匯入至新的存放庫

  1. 選取 [存放庫]、[檔案]。

    檢視您的分支

  2. 從存放庫下拉式清單中,選取 [ 匯入存放庫]。

    管理存放庫

  3. 如果來源存放庫可供公開使用,只要 輸入來源存放庫的複製URL 和新 Git 存放庫的名稱即可。

    如果來源存放庫是私人的,但可以使用基本身份驗證來存取(使用者名稱密碼、個人存取令牌等),請選取 [需要授權 ],然後輸入您的認證。 不支援 SSH 驗證,但您可以依照使用 git CLI 手動匯入存放庫中的步驟,手動匯入使用 SSH 驗證的存放庫。

    [匯入存放庫] 對話框

匯入現有的空白存放庫

在空白 Git 存放庫的 [ 檔案] 頁面上,選取 [ 入],然後 輸入複製 URL。 如果來源存放庫需要驗證,您必須提供認證。

將存放庫匯入現有的存放庫

注意

匯入功能會停用認可批注中所提及之工作專案的自動化連結,因為目的地專案中的工作專案標識碼可能與來源專案中的工作專案標識碼不同。 您可以流覽至 [設定 版本控制]、選取您的存放庫,然後選擇 [選項],以重新啟用認可中提及的工作專案自動連結。 如需使用工作專案連結認可的詳細資訊,請參閱 將工作專案連結至認可

使用 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]

參數

參數 描述
git-source-url 必要。 要匯入的來源 Git 存放庫 URL。
detect 選擇性。 自動偵測組織。 接受的值: falsetrue
git-service-endpoint-id 選擇性。 與外部端點連線的服務端點。
org, organization Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=<ORG_URL>如果未設定為預設,或透過 git 組態挑選,則為必要 專案。範例: https://dev.azure.com/MyOrganizationName/
project, p 項目的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=<NAME_OR_ID>如果未設定為預設,或透過 git 組態挑選,則為必要 專案。
repository 用來建立匯入要求之存放庫的名稱或標識碼。
requires-authorization 指出來源 Git 存放庫是否為私人的旗標。 如果您需要驗證,請在來源存放庫上產生驗證令牌,並將環境變數 AZURE_DEVOPS_EXT_GIT_SOURCE_PASSWORD_OR_PAT 設定為令牌的值。 然後匯入要求會包含驗證。
subscription 訂用帳戶的名稱或識別碼。 您可以使用 來設定預設訂用 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。 您也可以依照下列步驟,將 TFS 取代為 Azure Repos,以手動將存放庫匯入 Azure DevOps Services 存放庫。

  1. 使用 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
    
  2. 使用 TFS 2017 RTM 建立目標存放庫 ,並記下複製 URL。 在此範例中, https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo 是新目標存放庫的URL。

  3. 執行下列命令,將來源存放庫複製到目標存放庫。

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

    警告

    使用 --mirror 會覆寫目標存放庫中的所有分支,包括刪除不在來源存放庫中的任何分支。

  4. 如果來源存放庫有 LFS 物件,請擷取它們,然後將它們從來源存放庫複製到目標存放庫。

    git lfs fetch origin --all
    git lfs push --all https://dev.azure.com/contoso-ltd/MyFirstProject/_git/new-contoso-repo
    
  5. 執行下列命令來刪除暫存資料夾。

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

常見問題集

雖然匯入大部分時間都成功,但下列條件可能會導致問題。

如果我的來源存放庫位於雙因素驗證後方,該怎麼辦?

匯入服務會使用 REST API 來驗證和觸發匯入,而且無法直接使用需要雙因素驗證的存放庫。 大部分的 Git 裝載提供者,例如 GitHubAzure 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。 這會將所有 Git 物件從來源複製到 Azure DevOps(這也會匯入 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>.git
cd <name-of-repo>
git remote add --mirror=fetch upstream <original-repo-URL>
git fetch upstream --tags
git push origin --all

下一步