Azure DevOps Services |Azure DevOps Server 2022 および Azure DevOps Server 2019
この記事では、GitHub、Bitbucket、GitLab、またはその他の場所から既存の Git リポジトリを Azure DevOps プロジェクトの新規または空の既存のリポジトリにインポートする方法を紹介します。
前提条件
カテゴリ | 要求事項 |
---|---|
プロジェクトへのアクセス | プロジェクトのメンバー。 |
アクセス許可 | - プライベート プロジェクトでコードを表示する: 少なくとも Basic アクセス。 - プライベート プロジェクトのコードに複製または投稿する: 共同作成者 セキュリティ グループのメンバーまたはプロジェクト内の対応するアクセス許可。 - ブランチまたはリポジトリのアクセス許可の設定: ブランチまたはリポジトリのアクセス許可を管理します。 - デフォルトのブランチを変更する: リポジトリのポリシーを編集するためのアクセス許可。 - リポジトリのインポート: プロジェクト管理者 セキュリティ グループのメンバーまたは Git プロジェクト レベルでリポジトリの作成アクセス許可が許可に設定された場合。 詳細については、「Git リポジトリのアクセス許可を設定する」を参照してください。 |
サービス | リポジトリが有効になりました。 |
ツール | 省略可能。 「az repos コマンドを使用します: Azure DevOps CLI。」 |
注
パブリック プロジェクトでは、 利害関係者 アクセス権を持つユーザーは、コードの表示、複製、投稿など、Azure Repos へのフル アクセス権を持ちます。
カテゴリ | 要求事項 |
---|---|
プロジェクトへのアクセス | プロジェクトのメンバー。 |
アクセス許可 | - コードの表示: Basic アクセス以上。 - コードを複製または投稿する: 共同編集者のセキュリティ グループのメンバー、またはプロジェクト内の対応する権限が必要です。 |
サービス | リポジトリが有効になりました。 |
新しいリポジトリにインポートする
新しいリポジトリにインポートするには、次の手順を実行します。
注
Azure DevOps では、リポジトリのインポートが完了すると、そのリポジトリの既定のブランチが設定されます。 インポートされたリポジトリに main
という名前のブランチが含まれている場合は、既定のブランチとして設定されます。それ以外の場合は、インポートされたリポジトリの最初のブランチ (アルファベット順) が Default として設定されます。
ブラウザーで組織にサインインし、[ Repos>Files] を選択します。
リポジトリのドロップダウンから、[リポジトリのインポート] を選びます。
ソース リポジトリの複製 URL と、新しい Git リポジトリの名前を入力します。
- [ リポジトリのインポート] を選択します。
リポジトリがインポートされます。
既存の空のリポジトリにインポートする
空の 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 |
省略可能。 組織を自動的に検出します。 指定できる値: false 、true 。 |
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 を設定します。 セキュリティを強化するために、可能な場合は Microsoft Entra ID トークンを使用することをお勧めします。 その後、インポート要求に認証が含まれます。 |
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 を使用してリポジトリを手動でインポートする
次のコマンド ラインの例に示したように
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
ターゲット リポジトリを作成 し、複製 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
よく寄せられる質問 (FAQ)
インポートは最も頻繁に成功しますが、次の条件が原因で問題が発生する可能性があります。
- ソース リポジトリへのアクセスに 2 要素認証が必要な場合にはどうすれば良いですか?
- ソース リポジトリがmulti_ackをサポートしていない場合はどうしますか?
- 以前のオンプレミス バージョンからインポートできますか?
- MSA ベースの資格情報は使用できますか?
- TFVC からはインポートできますか?
- ソース リポジトリに Git LFS オブジェクトが含まれている場合はどうすれば良いですか?
Q: ソース リポジトリが 2 要素認証の背後にある場合はどうしますか?
A: インポート サービスは REST API を使用してインポートを検証およびトリガーし、2 要素認証を必要とするリポジトリを直接操作することはできません。
ほとんどの Git ホスティング プロバイダーは、インポート サービスに提供できる認証トークンをサポートしています。
Microsoft Entra ID トークン (推奨): Microsoft Entra ID トークンは、より優れたセキュリティを提供し、推奨される認証方法です。 これらのトークンは、次の方法で取得できます。
Azure CLI (開発/テスト用):
az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798 --query "accessToken" --output tsv
サービス プリンシパル (運用/自動化されたシナリオの場合):
- Microsoft Entra ID でアプリケーションの登録
- アプリケーションのクライアント シークレットを作成する
- Azure DevOps でアプリケーションに適切なアクセス許可を付与する
- サービス プリンシパルの資格情報を使用してプログラムでトークンを取得する
個人用アクセス トークン (代替):GitHub と Azure DevOps では、個人用アクセス トークンもサポートされます。
Q: ソース リポジトリがmulti_ackをサポートしていない場合はどうしますか?
A: インポート サービスでは、インポート時に Git プロトコルの multi_ack 機能が使用されます。 ソース リポジトリでこの機能が提供されない場合、インポート サービスは特定のソースからインポートに失敗する可能性があります。 このエラーは、インポート要求を作成するときか、インポートの進行中に発生する可能性があります。
Q: 以前のバージョンからインポートできますか?
A: ソース Git リポジトリが 2017 RTM より前のオンプレミス バージョンにある場合、最新の Azure DevOps と以前のバージョンの間のコントラクトの不一致により、インポートは失敗します。
Q: MSA ベースの資格情報を使用できますか?
A: 残念ながら、MSA (Microsoft アカウント) ベースの資格情報は機能しません。 インポート サービスは、ソース リポジトリとの通信に基本認証を使用しています。 使用しているユーザー名とパスワードが基本認証でない場合、認証とインポートは失敗します。 使用しているユーザー名/パスワードが基本的な認証であるかどうかを確認する 1 つの方法は、Git を使用して次の形式でリポジトリを複製することです。
git clone https://<<username>>:<<password>>@<<remaining clone Url>>
Q: TFVC からインポートできますか?
A: 既存の TFVC リポジトリから同じアカウント内の新しい Git リポジトリにコードを移行できます。 Git への移行には多くの利点があります。これは、大規模な TFVC リポジトリとチームに関連するプロセスです。 TFVC などの一元化されたバージョン コントロール システムは、基本的な点で Git とは動作が異なります。 スイッチには、新しいコマンドを学習する以外に多くの作業が必要です。 これは、慎重な計画を必要とする破壊的変更です。 詳しくは、TFVC から Git へのインポートに関するページをご覧ください。
Q: ソース リポジトリに Git LFS オブジェクトが含まれている場合はどうしますか?
A: Git インポートでは、Git LFS オブジェクトはインポートされません。
次の手順を使用すれば、LFS オブジェクトを移動できます。
- リポジトリのインポート機能を使用して、リポジトリを Azure DevOps にインポートします。 このアクションは、ソースから Azure DevOps にすべての Git オブジェクトをコピーします。これにより、Git オブジェクトである LFS ポインターもインポートされますが、LFS ファイルはインポートされません。
LFS ファイルを移動するには、同じボックスに Git.exe クライアントと LFS クライアントの両方が必要であり、ソース リポジトリと宛先リポジトリの両方にアクセスする必要があります。
- インポートしたリポジトリを Azure DevOps からローカル システムに複製します。 複製は機能しますが、LFS ファイルのチェックアウト中に失敗する
- ソース リポジトリをリモートとして追加します (例: "source"
- ソースからローカル リポジトリにすべての LFS ファイルを引き継ぐ
git lfs fetch source --all
を実行する - 対象 VSTS リポジトリが「ターゲット」リモートであると仮定する。
git lfs push target --all
を実行します。
Q: ソースが後で変更された場合、更新プログラムをインポートできますか。
A: インポート サービスは、最初にリポジトリ全体をインポートするためのものです。 後で変更を反映するには、リモートがソースと宛先の両方に設定されたリポジトリのローカル クローンが必要です。
変更を同期するには、次のコマンドを使用します。
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