Git リポジトリをインポートする

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

この記事では、GitHub、Bitbucket、GitLab、またはその他の場所から既存の Git リポジトリを Azure DevOps プロジェクトの新規または空の既存のリポジトリにインポートする方法を示します。

前提条件

  • 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 を使用してリポジトリを手動でインポートする」を参照してください。

Note

リポジトリのインポートが完了すると、Azure DevOps によって、そのインポートされたリポジトリの既定のブランチが設定されます。 インポートされたリポジトリに master という名前のブランチが含まれている場合は、既定のブランチとして設定されます。それ以外の場合は、インポートされたリポジトリの最初のブランチ (アルファベット順) が既定として設定されます。

新しいリポジトリにインポートする

  1. [Repos] (リポジトリ)[Files] (ファイル) を選択します。

    ブランチの表示

  2. リポジトリのドロップダウンから、[リポジトリのインポート] を選びます。

    リポジトリの管理

  3. ソース リポジトリが一般公開されている場合は、ソース リポジトリのクローン URL と新しい Git リポジトリの名前を入力するだけです。

    ソース リポジトリが非公開で、基本認証 (ユーザー名とパスワード、個人用アクセス トークンなど) を使用してアクセスできる場合は、[承認が必要] を選択し、資格情報を入力します。 SSH 認証はサポートされていませんが、「Git CLI を使用してリポジトリを手動でインポートする」の手順に従って、SSH 認証を使用するリポジトリを手動でインポートできます。

    [リポジトリのインポート] ダイアログ

既存の空のリポジトリにインポートする

空の Git リポジトリの [ファイル] ページで、[インポート] を選択し、クローン URL を入力します。 ソース リポジトリで認証が必要な場合は、資格情報を指定する必要があります。

既存のリポジトリへのリポジトリのインポート

注意

インポート機能を使用すると、コミットのコメントに記載されている作業項目の自動リンクが無効になります。これは、コピー先プロジェクトの作業項目 ID がソース プロジェクトの作業項目 ID と同じではない可能性があるためです。 コミットに記載されている作業項目の自動リンクを再び有効にするには、[設定][バージョン コントロール] に移動し、リポジトリを選択して、[オプション] を選びます。 コミットと作業項目のリンクの詳細については、作業項目のコミットへのリンクに関するページを参照してください。

az repos CLI を使用してリポジトリを手動でインポートする

az repos import を使用して、リポジトリを Azure DevOps プロジェクトにインポートできます。

注意

Git リポジトリをインポートする前に、まず Azure DevOps でリポジトリを作成する必要があります。 また、作成するリポジトリは空である必要があります。 リポジトリを作成するには、「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 config を使用して選択されていない場合は必須です (例: https://dev.azure.com/MyOrganizationName/)。
project, p プロジェクトの名前または ID。 az devops configure -d project=<NAME_OR_ID> を使って、既定のプロジェクトを構成できます。 既定として構成されていない場合、または git config を使用して選択されていない場合は必須です。
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 リポジトリが非公開である場合に指定するユーザー名。

次のコマンドでは、既定の構成 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber" 用の空の Git リポジトリ fabrikam-open-source にパブリック リポジトリ 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 に置き換えることで行います。

  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
    

よく寄せられる質問

ほとんどの場合、インポートは成功しますが、次の条件では問題が発生する可能性があります。

ソース リポジトリが 2 要素認証の背後にある場合はどうすればよいですか?

インポート サービスでは、REST API を使用してインポートを検証およびトリガーします。2 要素認証を必要とするリポジトリを直接操作することはできません。 GitHubAzure DevOps Services などのほとんどの Git ホスティング プロバイダーでは、インポート サービスに提供できる個人用トークンがサポートされています。

ソース リポジトリで 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) ベースの資格情報は機能しません。 インポート サービスは、ソース リポジトリとの通信に関して基本認証に依存しています。 使用しているユーザー名/パスワードが基本認証のものではない場合、認証に失敗し、インポートも失敗します。 使用しているユーザー名/パスワードが基本認証のものかどうかを確認する方法の 1 つは、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 オブジェクトがコピーされます (これにより、Git オブジェクトだが LFS ファイルではない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

次のステップ