다음을 통해 공유


기록을 포함하여 SVN(Subversion)에서 Git으로 마이그레이션하는 방법을 알아봅니다.

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

SVN(Subversion)와 같은 다른 버전 제어 시스템에서 Git으로 이동하는 경우 일반적으로 기록을 포함하지 않고 최신 버전의 리포지토리 콘텐츠만 마이그레이션하는 "팁 마이그레이션"을 수행하는 것이 좋습니다. 그러나 많은 사람들이 기록을 포함하여 고급 마이그레이션을 수행하려고 합니다. 이 문서에 제공된 지침에서는 기록이 있는 마이그레이션 을 소개합니다.

Git으로의 SVN 마이그레이션은 리포지토리의 이전 시간과 생성 및 병합된 분기 수, 일반 SVN을 사용하는지 또는 SVK와 같은 가까운 상대인지에 따라 복잡할 수 있습니다.

다음과 같은 경우 간단할 수 있습니다.

  • 새 리포지토리가 있습니다.
  • 트렁크, 분기 및 태그 디렉터리의 표준 설정이 있습니다.

다음과 같은 경우 복잡할 수 있습니다.

  • 팀에서 여러 분기 및 병합 작업을 수행했습니다.
  • 리포지토리는 비표준 디렉터리 설정을 따릅니다.
  • 시간이 지남에 따라 디렉터리 설정이 변경되었습니다.

SVN에서 Git으로 마이그레이션하는 방법에는 여러 가지가 있습니다. 이 문서에서 설명하는 접근 방식은 Git 확장인 git-svn을 사용하여 Subversion 리포지토리를 로컬 Git 리포지토리로 체크 아웃한 다음 로컬 Git 리포지토리의 변경 내용을 Subversion 리포지토리로 다시 푸시하는 데 사용할 수 있습니다. 이러한 단계는 원래 SVN 리포지토리로 다시 동기화하지 않고 Windows 환경에서 SVN에서 Git으로 마이그레이션하는 프로세스에 대한 자세한 개요를 제공합니다. 결과는 나머지 팀과 공유하기 위한 완전 Git 리포지토리가 됩니다.

참고 항목

중앙 집중식 버전 제어 시스템에서 Git으로 소스 코드를 마이그레이션하기 전에 중앙 집중식 버전 제어 시스템과 분산 버전 제어 시스템의 차이점을 숙지하고 팀의 마이그레이션을 계획해야 합니다. 준비한 후에는 마이그레이션을 시작할 수 있습니다.

SVN에서 Git으로 마이그레이션하기 위한 개략적인 워크플로는 다음과 같습니다.

  • 마이그레이션 환경 준비
  • 원본 SVN 리포지토리를 로컬 Git 리포지토리로 변환
  • (선택 사항) 개발자가 SVN을 계속 사용하는 동안 로컬 Git 리포지토리를 SVN 리포지토리의 변경 내용과 동기화
  • 로컬 Git 리포지토리를 Azure Repos에서 호스트되는 원격 Git 리포지토리로 푸시
  • SVN 리포지토리 잠금, SVN 리포지토리에서 로컬 Git 리포지토리로 나머지 변경 내용 동기화 및 Azure Repos의 원격 Git 리포지토리에 최종 변경 내용 푸시
  • 개발자가 기본 소스 제어 시스템으로 Git으로 전환

마이그레이션 환경 준비

로컬 워크스테이션에서 마이그레이션 환경을 구성하고 다음 소프트웨어를 설치합니다.

또한 변환된 SVN 리포지토리를 호스트하기 위해 조직에 대한 Git 리포지토리를 만들어야 합니다. 프로젝트에서 새 Git 리포지토리 만들기를 따를 수 있습니다.

원본 SVN 리포지토리를 로컬 Git 리포지토리로 변환

이 단계의 목표는 원본 Subversion 리포지토리를 로컬 Bare Git 리포지토리로 변환하는 것입니다. 완전 Git 리포지토리에는 변경할 수 있는 파일에 대한 로컬 작업 체크 아웃이 없으며, 대신 리포지토리의 기록 및 리포지토리 자체에 대한 메타데이터만 포함됩니다. Azure Repos와 같은 서비스에서 호스트되는 원격 리포지토리 통해 Git 리포지토리를 공유하는 데 권장되는 형식입니다.

Bare Git 리포지토리는 다르게 구조화되며 작업 디렉터리가 없다는 사실을 감안할 때 리포지토리에 대한 직접 커밋을 방지합니다.

완전 git 리포지토리

모든 Subversion 작성자 목록 검색

Subversion은 각 커밋에 대한 사용자 이름만 사용하고 Git은 실제 이름과 전자 메일 주소를 모두 저장합니다. 기본적으로 git-svn 도구는 작성자 및 전자 메일 필드에 SVN 사용자 이름을 나열합니다. 그러나 해당 Git 이름 및 전자 메일과 함께 SVN 사용자에 대한 매핑 파일을 만들 수 있습니다.

전복 사용자

전복 사용자

Git 사용자

git 사용자

로컬 Subversion 체크 아웃의 루트에서 모든 SVN 사용자 목록을 추출하려면 다음 PowerShell 명령을 실행합니다.

인코딩 결과를 utf8NoBOM 보려면 다음 명령을 실행합니다.

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding utf8NoBOM

인코딩 결과를 ASCII 보려면 다음 명령을 실행합니다.

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding ASCII

이 명령은 모든 로그 메시지를 검색하고, 사용자 이름을 추출하고, 중복된 사용자 이름을 제거하고, 사용자 이름을 정렬하고, UTF-8 형식(또는 지정한 인코딩에 따라 ASCII 형식)으로 authors-transform.txt 파일에 배치합니다. 그런 다음 파일의 각 줄을 편집하여 SVN 사용자를 잘 포맷된 Git 사용자에 매핑할 수 있습니다. 예를 들어 에 매핑 jamal = jamal <jamal>jamal = Jamal Hartnett <jamal@fabrikam-fiber.com>수 있습니다.

git-svn을 사용하여 Subversion 리포지토리 복제

다음 명령은 이전 단계에서 만든 authors-transform.txt 파일을 사용하여 표준 git-svn 변환을 수행합니다. 로컬 컴퓨터의 폴더에 Git 리포지토리가 c:\mytempdir 배치됩니다.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir

참고 항목

--prefix=svn/ 그렇지 않으면 도구가 가져온 수정 버전을 SVN 수정 버전에 알릴 수 없으므로 이 작업이 필요합니다. SVN 추적 참조가 Git의 자체 원격 추적 분기 레이아웃()과 호환되는 위치에 refs/remotes/$prefix/배치되므로 접두사(refs/remotes/$remote/후행 슬래시 포함)를 설정하는 것이 좋습니다.

접두사 설정은 공통 리포지토리를 공유하는 여러 프로젝트를 추적하려는 경우에도 유용합니다. 기본적으로 접두사는 .로 설정됩니다 origin/.

표준 트렁크, 분기, 태그 레이아웃을 사용하는 경우 방금 배치 --stdlayout합니다. 그러나 다른 것이 있는 경우 , --branches를 전달--trunk하고 --tags 무엇이 무엇인지 찾아야 할 수 있습니다. 예를 들어 리포지토리 구조가 트 trunk/companydir 렁크 대신 분기된 경우 원하는 --trunk=trunk/companydir --branches=branches것입니다.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --trunk=/trunk --branches=/branches --tags=/tags  --authors-file "authors-transform.txt" c:\mytempdir

참고 항목

이 명령은 SVN 리포지토리의 크기에 따라 몇 분에서 몇 시간이 걸릴 수 있습니다. 완료되면 리포지토리의 Git 체크 아웃이 표시됩니다.

버전 제어 관련 구성 변환

SVN 리포지토리에서 svn:ignore 속성을 사용하는 경우 다음을 사용하여 .gitignore 파일로 변환할 수 있습니다.

cd c:\mytempdir
git svn show-ignore --id=origin/trunk > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

.gitignore에 대한 자세한 정보: Git을 사용하여 파일 변경 내용 무시

완전 git 리포지토리에 리포지토리 푸시

이 단계에서는 bare 리포지토리를 만들고 해당 기본 분기 SVN의 트렁크 분기 이름과 일치하도록 만듭니다.

  1. Bare Git 리포지토리 만들기

    git init --bare c:\new-bare.git
    cd c:\new-bare.git
    git symbolic-ref HEAD refs/heads/svn/trunk
    
  2. 로컬 Git 리포지토리를 새 Bare Git 리포지토리로 푸시

    cd c:\mytempdir 
    git remote add bare c:\new-bare.git 
    git config remote.bare.push refs/remotes/*:refs/heads/* 
    git push bare 
    
  3. 분기 이름을 .로 trunk main바꿉니다. 주 개발 분기의 이름은 Subversion에 있던 이름과 일치하는 "트렁크"로 지정됩니다. 다음을 사용하여 Git의 표준 main 분기로 이름을 바꾸려고 합니다.

    cd c:\new-bare.git
    git branch -m svn/trunk main
    
  4. 분기 및 태그를 정리하면 git-svn은 모든 Subversions 태그를 "tags/name" 형식의 Git에서 매우 짧은 분기로 만듭니다. 이러한 모든 분기를 실제 Git 태그로 변환하거나 삭제하려고 합니다.

SVN 태그를 Git 태그로 마이그레이션

cd c:\new-bare.git
git for-each-ref --format='%(refname)' refs/heads/svn/tags | % { $_.Replace('refs/heads/svn/tags/','') } | % { git tag $_ "refs/heads/svn/tags/$_"; git branch -D "svn/tags/$_" }

고급 마이그레이션

모든 SVN 분기를 적절한 Git 분기로 만들기

모든 SVN 분기를 적절한 Git 분기로 쉽게 만들 수 있지만 계속하기 전에 다음 사항을 평가하는 것이 좋습니다.

  • 기능 분기가 있는 경우: 마이그레이션하기 전에 트렁크에 통합될 때까지 기다릴 수 있나요?

  • 릴리스 분기가 있는 경우: 서비스를 위해 SVN을 유지하는 것이 합리적입니까? 기능 분기 마이그레이션하는 경우 Git에서 분기를 서비스할 준비가 되었는지 여부

기존 분기를 마이그레이션하려면 다음 PowerShell 명령을 실행합니다.

git for-each-ref --format='%(refname)' refs/remotes | % { $_.Replace('refs/remotes/','') } | % { git branch "$_" "refs/remotes/$_"; git branch -r -d "$_"; }

참고 항목

이 명령은 SVN 리포지토리의 크기에 따라 몇 분에서 몇 시간이 걸릴 수 있습니다. 완료되면 리포지토리의 Git 체크 아웃이 표시됩니다.

특정 수정 버전만 마이그레이션

지정 git-svn clone 하지 않으면 모든 수정 버전을 첫 번째 커밋(r1)에서 HEAD로 마이그레이션합니다. 특정 수정 버전 집합만 마이그레이션해야 하는 경우 명령을 git-svn clone 옵션 -r과 함께 추가해야 합니다.

예를 들어 rev 100에서 HEAD로 마이그레이션해야 하는 경우 명령은 다음과 같습니다.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir -r100:HEAD

워크플로 업데이트

중앙 집중식 버전 제어 시스템에서 Git으로 이동하는 것은 단순히 코드를 마이그레이션하는 것 이상입니다. 팀은 Git이 기존 버전 제어 시스템과 어떻게 다른지, 그리고 이러한 차이가 일상적인 작업에 어떤 영향을 미치는지 이해하기 위한 교육이 필요합니다. 자세히 알아보기.

참조 정보

저자: 호삼 카멜, 윌리엄 H. 살라자르 | 이 문서의 원본을 찾아 ALM | DevOps Rangers 분기 지침

(c) 2017 Microsoft Corporation. All rights reserved. 이 문서는 "있는 그대로" 제공됩니다. URL 및 기타 인터넷 웹 사이트 참조를 포함하여 이 문서에 표현된 정보 및 보기는 예고 없이 변경될 수 있습니다. 이 문서의 사용으로 발생하는 위험은 귀하의 책임입니다.

이 문서는 Microsoft 제품의 지적 재산권에 대한 법적 권리를 제공하지 않습니다. 이 문서는 내부 참조용으로 복사 및 사용할 수 있습니다.