다음을 통해 공유


프로젝트에 Git 리포지토리 가져오기

Azure DevOps 서비스 | Azure DevOps 서버 2022 - Azure DevOps Server 2019

이 문서에서는 GitHub, Bitbucket, GitLab 또는 기타 위치에서 Azure DevOps 프로젝트의 새롭거나 비어 있는 기존 리포지토리로 기존 Git 리포지토리를 가져오는 방법을 보여 줍니다.

필수 조건

카테고리 요구 사항
프로젝트 액세스 프로젝트멤버입니다.
권한 - 프라이빗 프로젝트에서 코드 보기: 최소 기본 액세스.
- 프라이빗 프로젝트의 코드 복제 또는 기여: 기여자 보안 그룹 또는 프로젝트의 해당 사용 권한의 구성원입니다.
- 분기 또는 리포지토리 사용 권한 설정: 분기 또는 리포지토리에 대한 사용 권한 사용 권한 관리
- 기본 분기 변경: 리포지토리에 대한 정책 편집 권한 설정.
- 리포지토리 가져오기: 프로젝트 관리자 보안 그룹의 구성원이거나, Git 프로젝트 수준에서 리포지토리 만들기 권한이 허용으로 설정된 경우. 자세한 내용은 Git 리포지토리 권한 설정을 참조 하세요.
서비스 리포지토리가 활성화되었습니다.
도구 선택 사항. az repos 명령어를 사용하세요: Azure DevOps CLI.

참고

퍼블릭 프로젝트에서 이해 관계자 액세스 권한이 있는 사용자는 코드 보기, 복제 및 기여를 포함하여 Azure Repos에 대한 모든 권한을 갖습니다.

카테고리 요구 사항
프로젝트 액세스 프로젝트멤버입니다.
권한 - 코드 보기: 최소 베이직 접근 권한.
- 코드 복제 또는 기여: 기여자 보안 그룹의 구성원이거나 프로젝트에서 해당 권한을 가진 경우.
서비스 리포지토리가 활성화되었습니다.

새 리포지토리로 가져오기

새 리포지토리로 가져오려면 다음 단계를 수행합니다.

참고

리포지토리 가져오기가 완료되면 Azure DevOps는 가져온 리포지토리에 대한 기본 분기를 설정합니다. 가져온 리포지토리에 이름이 지정된 main분기가 포함되어 있으면 기본 분기로 설정되고, 그렇지 않으면 가져온 리포지토리의 첫 번째 분기(사전순)가 기본값으로 설정됩니다.

  1. 브라우저에서 조직에 로그인하고 Repos>Files를 선택합니다.

    스크린샷에는 브랜치 뷰가 표시됩니다.

  2. 리포지토리 드롭다운에서 리포지토리 가져오기를 선택합니다.

    스크린샷은 리포지토리 관리 화면을 보여줍니다.

  3. 원본 리포지토리의 복제 URL과 새 Git 리포지토리의 이름을 입력합니다.

스크린샷은 공개적으로 사용 가능한 샘플 리포지토리 URL이 있는 리포지토리 가져오기 대화 상자를 보여줍니다.

  1. 리포지토리 가져오기를 선택합니다.

리포지토리를 가져옵니다.

기존 빈 리포지토리로 가져오기

빈 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 구성을 통해 선택되는 경우 필수 입니다. 예: 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 를 토큰 값으로 설정합니다. 보안 강화를 위해 가능한 경우 Microsoft Entra ID 토큰을 사용하는 것이 좋습니다. 그런 다음 가져오기 요청에 인증이 포함됩니다.
subscription 구독의 이름 또는 ID입니다. az account set -s <NAME_OR_ID>를 사용하여 기본 구독을 구성할 수 있습니다.
user-name git 리포지토리가 프라이빗일 때 지정할 사용자 이름입니다.

예제

다음 명령은 기본 구성을 위해 공용 리포지토리 fabrikam-open-source를 빈 Git 리포지토리 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"로 가져옵니다.

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를 사용하여 리포지토리를 수동 가져오기

  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. 대상 리포지토리를 만들고 복제 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
    

FAQ(질문과 대답)

가져오기는 가장 자주 성공하지만 다음 조건으로 인해 문제가 발생할 수 있습니다.

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에서 애플리케이션에 적절한 권한 부여
    • 서비스 주체 자격 증명을 사용하여 프로그래밍 방식으로 토큰 가져오기

개인용 액세스 토큰(대체):GitHubAzure DevOps 는 개인용 액세스 토큰도 지원합니다.

Q: 원본 리포지토리가 multi_ack 지원하지 않는 경우 어떻게 해야 할까요?

A: 가져오기 서비스는 가져오는 동안 Git 프로토콜의 multi_ack 기능을 사용합니다. 원본 리포지토리에서 이 기능을 제공하지 않으면 가져오기 서비스가 지정된 원본에서 가져오지 못할 수 있습니다. 이 오류는 가져오기 요청을 만들거나 가져오기가 진행 중인 동안 발생할 수 있습니다.

Q: 이전 버전에서 가져올 수 있나요?

A: 원본 Git 리포지토리가 2017 RTM 이전의 온-프레미스 버전에 있는 경우 최신 Azure DevOps와 이전 버전 간의 계약 불일치로 인해 가져오기가 실패합니다.

Q: MSA 기반 자격 증명을 사용할 수 있나요?

A: 아쉽게도 MSA(Microsoft 계정) 기반 자격 증명이 작동하지 않습니다. 가져오기 서비스는 원본 리포지토리와 통신하기 위해 기본 인증을 사용합니다. 사용 중인 사용자 이름과 암호가 기본 인증이 아닌 경우 인증 및 가져오기가 실패합니다. 사용하는 사용자 이름/암호가 기본 인증인지 여부를 확인하는 한 가지 방법은 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").
  • 수행 git lfs fetch source --all- 원본에서 로컬 리포지토리로 모든 LFS 파일을 가져옵니다.
  • 대상 Visual Studio Team Services(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

다음 단계