기록이 있는 SVN 저장소를 새 Git 저장소로 마이그레이션하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/79165

문제

Git 매뉴얼, FAQ, Git - SVN 크래시 코스 등을 읽었습니다.그들은 모두 이것저것 설명하지만, 다음과 같은 간단한 지침은 어디에서도 찾을 수 없습니다.

SVN 저장소: svn://myserver/path/to/svn/repos

Git 저장소: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

나는 그것이 그렇게 간단할 것이라고 기대하지 않으며, 그것이 단일 명령이 될 것이라고 기대하지도 않습니다.그러나 나는 그것이 아무것도 설명하려고 시도하지 않을 것이라고 기대합니다. 단지 이 예에서 어떤 단계를 취해야 하는지를 말하는 것뿐입니다.

도움이 되었습니까?

해결책

마법:

$ git svn clone http://svn/repo/here/trunk

Git과 SVN은 매우 다르게 작동합니다.Git을 배워야 하고, SVN 업스트림의 변경 사항을 추적하려면 Git도 배워야 합니다. git-svn.그만큼 git-svn 매뉴얼 페이지에는 좋은 예제 섹션이 있습니다.

$ git svn --help

다른 팁

사용자 파일을 생성합니다(예: users.txt) SVN 사용자를 Git에 매핑하는 경우:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

이 단일 라이너를 사용하여 기존 SVN 저장소에서 템플릿을 빌드할 수 있습니다.

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

파일에 없는 누락된 SVN 사용자가 발견되면 SVN이 중지됩니다.하지만 그 후에는 파일을 업데이트하고 중단한 부분부터 다시 시작할 수 있습니다.

이제 저장소에서 SVN 데이터를 가져옵니다.

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

이 명령은 다음 위치에 새로운 Git 저장소를 생성합니다. dest_dir-tmp SVN 저장소를 가져오기 시작합니다."--stdlayout" 플래그는 일반적인 "trunk/, Branchs/, Tags/" SVN 레이아웃이 있음을 의미합니다.레이아웃이 다른 경우 다음 사항에 익숙해지세요. --tags, --branches, --trunk 옵션(일반적으로 git svn help).

모든 일반 프로토콜이 허용됩니다. svn://, http://, https://.URL은 다음과 같이 기본 저장소를 대상으로 해야 합니다. http://svn.mycompany.com/myrepo/repository.그래야만 해 ~ 아니다 포함하다 /trunk, /tag 또는 /branches.

이 명령을 실행한 후 작업이 "정지/정지"된 것처럼 보이는 경우가 많으며 새 저장소를 초기화한 후 오랜 시간 동안 정체될 수 있는 것이 정상입니다.결국 마이그레이션 중임을 나타내는 로그 메시지가 표시됩니다.

또한 --no-metadata 플래그를 지정하면 Git은 해당 SVN 개정에 대한 정보를 커밋 메시지에 추가합니다(예: git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

사용자 이름을 찾을 수 없으면 업데이트하세요. users.txt 그런 다음 파일을 작성하십시오.

cd dest_dir-tmp
git svn fetch

대규모 프로젝트가 있는 경우 모든 Subversion 커밋을 가져올 때까지 마지막 명령을 여러 번 반복해야 할 수도 있습니다.

git svn fetch

완료되면 Git은 SVN을 체크아웃합니다. trunk 새로운 지점으로.다른 모든 지점은 원격으로 설정됩니다.다음을 사용하여 다른 SVN 분기를 볼 수 있습니다.

git branch -r

리포지토리에 다른 원격 브랜치를 유지하려면 각 브랜치에 대해 수동으로 로컬 브랜치를 생성해야 합니다.(트렁크/마스터를 건너뜁니다.) 이렇게 하지 않으면 마지막 단계에서 분기가 복제되지 않습니다.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

태그는 분기로 가져옵니다.Git에서 태그로 사용하려면 로컬 브랜치를 생성하고 태그를 만든 다음 브랜치를 삭제해야 합니다."v1" 태그를 사용하여 수행하려면:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

GIT-SVN 저장소를 깨끗한 Git 저장소에 복제합니다.

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

이전에 원격 브랜치에서 생성한 로컬 브랜치는 새로 복제된 저장소에 원격 브랜치로만 복사되었습니다.(트렁크/마스터를 건너뛰십시오.) 유지하려는 각 분기에 대해 다음을 수행하십시오.

git checkout -b local_branch origin/remote_branch

마지막으로 현재 삭제된 임시 저장소를 가리키는 깨끗한 Git 저장소에서 원격을 제거합니다.

git remote rm origin

Subversion 저장소를 Git 저장소로 깔끔하게 마이그레이션.먼저 Subversion 커밋 작성자 이름을 Git 커미터에 매핑하는 파일을 만들어야 합니다. ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

그런 다음 Subversion 데이터를 Git 저장소에 다운로드할 수 있습니다.

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Mac을 사용하는 경우 다음을 얻을 수 있습니다. git-svn MacPorts에서 설치하여 git-core +svn.

Subversion Repository가 원하는 Git 저장소와 동일한 기계에 있으면이 구문을 Init 단계에 사용할 수 있습니다.

git svn init file:///home/user/repoName --no-metadata

나는 svn2git 스크립트 매력처럼 작동합니다.

git-svn을 지속적으로 사용하기 전에 Git에 익숙해지는 것이 좋습니다.SVN을 중앙 집중식 저장소로 유지하고 Git을 로컬로 사용합니다.

그러나 모든 기록이 포함된 간단한 마이그레이션의 경우 다음과 같은 몇 가지 간단한 단계가 있습니다.

로컬 저장소를 초기화합니다.

mkdir project
cd project
git svn init http://svn.url

개정판 가져오기를 시작하려는 기간을 표시하세요.

git svn fetch -r42

(또는 모든 버전에 대해 "git svn fetch"만 사용)

실제로 그 이후로 모든 것을 가져옵니다.

git svn rebase

Gitk를 사용하여 가져오기 결과를 확인할 수 있습니다.이것이 Windows에서 작동하는지 확실하지 않지만 OSX 및 Linux에서는 작동합니다.

gitk

SVN 저장소를 로컬로 복제한 경우 더 쉬운 협업을 위해 중앙 집중식 Git 저장소로 푸시할 수 있습니다.

먼저 빈 원격 저장소를 만듭니다(아마도 GitHub?):

git remote add origin git@github.com:user/project-name.git

그런 다음 선택적으로 메인 브랜치를 동기화하면 두 가지 모두 새로운 항목이 포함된 경우 끌어오기 작업이 원격 마스터를 로컬 마스터와 자동으로 병합합니다.

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

그 후에는 내가 직접 시도해 보는 데 관심이 있으실 수도 있습니다. git_remote_branch 원격 지점을 처리하는 데 도움이 되는 도구:

첫 번째 설명 게시물:"힘내 원격 지점"

최신 버전에 대한 후속 조치:"git_remote_branch와 협력할 시간입니다."

Subversion에서 Git으로의 원활한 마이그레이션을 위한(또는 두 가지를 동시에 사용하기 위한) 새로운 솔루션이 있습니다. SubGit.

저는 이 프로젝트를 직접 진행하고 있습니다.우리는 리포지토리에서 SubGit을 사용합니다. 팀원 중 일부는 Git과 일부 Subversion을 사용하고 있으며 지금까지는 매우 잘 작동합니다.

SubGit을 사용하여 Subversion에서 Git으로 마이그레이션하려면 다음을 실행해야 합니다.

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

그런 다음 svn_repos/.git에 Git 저장소를 가져와서 복제하거나 Subversion과 이 새로운 Git 저장소를 계속 함께 사용할 수 있습니다.SubGit은 두 가지가 항상 동기화되어 있는지 확인합니다.

Subversion 저장소에 여러 프로젝트가 포함된 경우 svn_repos/git 디렉터리에 여러 Git 저장소가 생성됩니다.실행하기 전에 번역을 사용자 정의하려면 다음을 수행하십시오.

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

와 함께 SubGit git-svn이 아닌 순수 Git으로 마이그레이션하여 필요할 때까지 Subversion을 유지하면서 사용할 수 있습니다(예: 이미 구성된 빌드 도구의 경우).

도움이 되었기를 바랍니다!

공식 보기 git-svn 맨페이지.특히 "기본 예"를 살펴보세요.

전복 관리 프로젝트 전체를 추적하고 기여합니다 (트렁크, 태그 및 분기 완료) :

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

Pro Git 8.2에서는 다음과 같이 설명합니다.http://git-scm.com/book/en/Git-and-Other-Systems-Migating-to-Git

SubGit (죽음의 블루스크린과 비교)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

그게 다야.

+ 첫 번째 명령으로 생성된 Git 저장소인 SVN에서 업데이트합니다.

subgit import  directory/path/Local.git.Repo

거대한 저장소를 위해 즉시 Git으로 마이그레이션하는 방법을 사용했습니다.
물론 준비가 필요합니다.
그러나 개발 프로세스를 전혀 중단할 수는 없습니다.

여기 내 길이 있습니다.

내 솔루션은 다음과 같습니다

  • SVN을 Git 저장소로 마이그레이션
  • 팀이 전환하기 직전에 Git 저장소를 업데이트합니다..

대규모 SVN 저장소의 경우 마이그레이션에는 많은 시간이 걸립니다.
그러나 완료된 마이그레이션을 업데이트하는 데는 단 몇 초밖에 걸리지 않습니다.

물론 저는 사용하고 있어요 SubGit, 엄마.git-svn이 나를 만든다 죽음의 블루스크린.그냥 끊임없이.그리고 git-svn은 Git의 "파일 이름이 너무 깁니다" 치명적 오류.

단계

1. SubGit 다운로드

2. 마이그레이션 및 업데이트 명령을 준비합니다.

Windows용으로 수행한다고 가정해 보겠습니다(Linux로 포팅하는 것은 쉽지 않습니다).
SubGit 설치에서 큰 상자 디렉터리(subgit-2.X.X\bin)에 두 개의 .bat 파일을 만듭니다.

마이그레이션을 위한 파일/명령 내용:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

여기서 "start" 명령은 선택 사항입니다(Windows).시작 시 오류를 확인하고 SubGit 완료 후 쉘을 열어 두었습니다.

여기에 추가할 수도 있습니다 git-svn과 유사한 추가 매개변수.나만 사용하고 있다 --default-domain myCompanyDomain.com SVN 작성자의 이메일 주소 도메인을 수정합니다.
표준 SVN 저장소의 구조(트렁크/분기/태그)가 있고 "작성자 매핑"에 문제가 없었습니다.그래서 저는 더 이상 아무것도 하지 않습니다.

(브랜치와 같은 태그를 마이그레이션하려는 경우 또는 SVN에 여러 브랜치/태그 폴더가 있는 경우 더 자세한 SubGit 사용을 고려할 수 있습니다. 접근하다)

팁 1:--minimal-revision YourSvnRevNumber를 사용하면 문제가 어떻게 해결되는지 빠르게 확인할 수 있습니다(일종의 디버깅).해결된 작성자 이름이나 이메일을 보는 것이 특히 유용합니다.
또는 마이그레이션 기록 깊이를 제한합니다.

팁 2:마이그레이션이 중단될 수 있습니다(Ctrl 키 + ) 다음 업데이트 명령/파일을 실행하여 복원됩니다.
큰 저장소에서는 이 작업을 수행하지 않는 것이 좋습니다."메모리 부족 Java+Windows 예외"를 받았습니다.

팁 3:결과 베어 저장소의 복사본을 만드는 것이 더 좋습니다.

업데이트를 위한 파일/명령 내용:

start    subgit import  directory/path/Local.git.Repo

Git 리포지토리에 대한 마지막 팀의 커밋을 얻고 싶을 때 언제든지 실행할 수 있습니다.

경고! 기본 저장소(예: 분기 생성)를 건드리지 마세요.
다음과 같은 치명적인 오류가 발생합니다.

복구할 수 없는 오류:동기화되지 않아 동기화할 수 없습니다...Subversion 개정을 Git 커밋으로 변환하는 중...

3. 첫 번째 명령/파일을 실행합니다.큰 저장소에는 시간이 오래 걸릴 것입니다.내 겸손한 저장소에 30시간이 걸렸습니다.

그게 다야.
두 번째 파일/명령을 실행하여 언제든지 SVN에서 Git 리포지토리를 업데이트할 수 있습니다.그리고 개발 팀을 Git으로 전환하기 전에.
몇 초 밖에 걸리지 않습니다.



유용한 작업이 하나 더 있습니다.

로컬 Git 저장소를 원격 Git 저장소로 푸시

당신의 경우인가요?계속합시다.

  1. 리모컨 구성

달리다:

$ git remote add origin url://your/repo.git
  1. 거대한 로컬 Git 저장소를 원격 저장소로 처음 보낼 준비를 합니다.

기본적으로 Git은 큰 덩어리를 보낼 수 없습니다.치명적인:원격 끝이 예기치 않게 끊겼습니다.

그것을 위해 달려봅시다:

git config --global http.postBuffer 1073741824

524288000-500 MB 1073741824-1GB 등

지역 문제를 해결하세요 인증서 문제.git-server가 깨진 인증서를 사용하는 경우.

비활성화했습니다 인증서.

또한 Git 서버에는 요청 금액 제한을 수정해야 함.

  1. 모든 마이그레이션 푸시 팀의 원격 Git 저장소로 이동합니다.

로컬 Git으로 실행:

git push origin --mirror

(자식 푸시 원점 '*:*' 이전 Git 버전의 경우)

다음과 같은 결과가 나오면: 오류:git을 생성할 수 없습니다:해당 파일이나 디렉터리가 없습니다....내 저장소를 완전히 다시 재생하면 이 오류가 해결됩니다(30시간).다음 명령을 시도해 볼 수 있습니다

git push origin --all
git push origin --tags

아니면 힘내 다시 설치 (나한테는 쓸모없어).또는 모든 태그에서 브랜치를 생성하고 푸시할 수도 있습니다.아니면, 아니면, 아니면...

재수술 의사

복잡한 경우에는 재수술을 통해 에릭 S.레이먼드 선택하는 도구입니다.SVN 외에도 SVN은 다음을 통해 다른 많은 버전 제어 시스템을 지원합니다. fast-export 형식, 그리고 또한 CVS.저자는 다음과 같은 고대 저장소의 성공적인 변환을 보고합니다. 이맥스 그리고 FreeBSD.

도구는 분명히 거의 완벽한 전환을 목표로 함 (예: SVN 변환 svn:ignore 속성 .gitignore 파일) 오랜 역사를 지닌 어려운 저장소 레이아웃의 경우에도 마찬가지입니다.대부분의 경우 다른 도구를 사용하는 것이 더 쉬울 수 있습니다.

문서에 대해 자세히 알아보기 전에 reposurgeon 명령줄에서 훌륭한 내용을 꼭 읽어보세요. DVCS 마이그레이션 가이드 변환 프로세스를 단계별로 진행합니다.

Atlassian 웹사이트에 있는 이 가이드는 제가 찾은 최고의 가이드 중 하나입니다.

https://www.atlassian.com/git/migration

이 도구는 - https://bitbucket.org/atlassian/svn-migration-scripts - 무엇보다도 Authors.txt를 생성하는 데에도 정말 유용합니다.

설치해야합니다

git
git-svn

이 링크에서 복사함 http://john.albin.net/git/convert-subversion-to-git.

1.모든 Subversion 커미터 목록 검색

Subversion은 단순히 각 커밋의 사용자 이름을 나열합니다.Git의 커밋에는 훨씬 더 풍부한 데이터가 있지만 가장 간단하게 커밋 작성자의 이름과 이메일이 나열되어 있어야 합니다.기본적으로 git-svn 도구는 작성자 및 이메일 필드 모두에 SVN 사용자 이름을 나열합니다.그러나 약간의 작업을 통해 모든 SVN 사용자 목록과 해당 Git 이름 및 이메일 목록을 만들 수 있습니다.이 목록은 git-svn에서 일반 svn 사용자 이름을 적절한 Git 커미터로 변환하는 데 사용할 수 있습니다.

로컬 Subversion 체크아웃 루트에서 다음 명령을 실행합니다.

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

그러면 모든 로그 메시지가 수집되고, 사용자 이름을 뽑아내고, 중복된 사용자 이름을 제거하고, 사용자 이름을 정렬하여 "authors-transform.txt" 파일에 저장합니다.이제 파일의 각 줄을 편집합니다.예를 들어 다음과 같이 변환합니다.

jwilkins = jwilkins <jwilkins>

이것에:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2.git-svn을 사용하여 Subversion 저장소 복제

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

그러면 표준 git-svn 변환(1단계에서 생성한 Authors-transform.txt 파일 사용)이 수행되고 git 저장소가 홈 디렉터리 내의 “~/temp” 폴더에 배치됩니다.

삼.svn:ignore 속성을 .gitignore로 변환

svn repo가 ​​svn:ignore 속성을 사용하고 있었다면 다음을 사용하여 이를 .gitignore 파일로 쉽게 변환할 수 있습니다.

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4.저장소를 베어 Git 저장소로 푸시

먼저 베어 저장소를 만들고 기본 분기가 svn의 "트렁크" 분기 이름과 일치하도록 만듭니다.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

그런 다음 임시 저장소를 새로운 베어 저장소로 푸시합니다.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

이제 ~/temp 저장소를 안전하게 삭제할 수 있습니다.

5."트렁크" 지점의 이름을 "마스터"로 바꿉니다.

주요 개발 브랜치의 이름은 Subversion의 이름과 일치하는 "트렁크"로 지정됩니다.다음을 사용하여 Git의 표준 "마스터" 브랜치로 이름을 바꾸고 싶을 것입니다.

cd ~/new-bare.git
git branch -m trunk master

6.분기 및 태그 정리

git-svn은 모든 Subversions 태그를 Git에서 “tags/name” 형식의 매우 짧은 분기로 만듭니다.다음을 사용하여 모든 브랜치를 실제 Git 태그로 변환하고 싶을 것입니다.

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

이 단계에서는 약간의 타이핑이 필요합니다.:-) 하지만 걱정하지 마세요.유닉스 쉘은 git for-each-ref로 시작하는 매우 긴 명령에 대한 > 보조 프롬프트를 제공합니다.

이제 GitHub에는 다음과 같은 기능이 있습니다. SVN 저장소에서 가져오기.하지만 나는 그것을 시도한 적이 없습니다.

git, SVN 및 bash를 사용하여 다소 확장된 답변입니다.여기에는 트렁크/분기/태그 디렉터리 레이아웃과 함께 기존 레이아웃을 사용하지 않는 SVN 저장소에 대한 단계가 포함되어 있습니다(SVN은 이러한 종류의 레이아웃을 적용하기 위해 전혀 아무것도 하지 않습니다).

먼저 이 bash 스크립트를 사용하여 SVN 저장소를 스캔하여 기여한 다양한 사람들을 검색하고 매핑 파일용 템플릿을 생성하세요.

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

이것을 사용하여 authors 다음을 사용하여 개발자가 설정한 대로 svn 사용자 이름을 사용자 이름 및 이메일에 매핑하는 파일 git config 속성 user.name 그리고 user.email (GitHub와 같은 서비스의 경우 일치하는 이메일만 있으면 충분합니다.)

그럼 git svn svn 저장소를 git 저장소에 복제하여 매핑에 대해 알려줍니다.

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

git svn은 존재하는 모든 태그나 브랜치에 대한 모든 개정판을 개별적으로 확인하므로 이는 엄청나게 오랜 시간이 걸릴 수 있습니다.(SVN의 태그는 실제로는 브랜치이므로 Git에서도 그렇게 됩니다.)필요하지 않은 SVN의 오래된 태그와 분기를 제거하면 속도를 높일 수 있습니다.

동일한 네트워크 또는 동일한 서버의 서버에서 이를 실행하면 속도가 실제로 향상될 수 있습니다.또한 어떤 이유로 이 프로세스가 중단되는 경우 ~할 수 있다 다음을 사용하여 재개하세요.

git svn rebase --continue

대부분의 경우 여기에서 완료됩니다.그러나 SVN 저장소에 SVN에 디렉터리만 있고 git 브랜치에 넣고 싶은 독특한 레이아웃이 있는 경우 몇 가지 추가 단계를 수행할 수 있습니다.

가장 간단한 방법은 규칙을 따르고 사용하는 서버에 새로운 SVN 저장소를 만드는 것입니다. svn copy 디렉터리를 트렁크나 지점에 넣으려면내가 마지막으로 이것을 시도했을 때 귀하의 디렉토리가 저장소의 루트에 있는 경우 이것이 유일한 방법일 수 있습니다. git svn 단순히 결제를 거부했습니다.

git을 사용하여 이 작업을 수행할 수도 있습니다.을 위한 git svn clone git 브랜치에 넣으려는 디렉토리를 사용하기만 하면 됩니다.

실행 후

git branch --set-upstream master git-svn
git svn rebase

이를 위해서는 Git 1.7 이상이 필요합니다.

단계별 가이드를 게시했습니다(여기) svn 태그를 git 태그로 변환하고 svn 분기를 git 분기로 변환하는 것을 포함하여 svn in을 git으로 변환합니다.

짧은 버전:

1) 특정 개정 번호에서 svn을 복제합니다.(개정 번호는 마이그레이션하려는 가장 오래된 버전이어야 합니다)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) svn 데이터를 가져옵니다.이 단계는 가장 많은 시간이 소요되는 단계입니다.

cd gitreponame
git svn fetch

오류 없이 완료될 때까지 git svn fetch를 반복합니다.

3) 마스터 브랜치 업데이트 받기

git svn rebase

4) 참조를 복사하여 svn 분기에서 로컬 분기를 만듭니다.

cp .git/refs/remotes/origin/* .git/refs/heads/

5) svn 태그를 git 태그로 변환

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) github과 같은 더 나은 곳에 저장소를 두십시오.

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

더 자세한 내용을 원하시면 제 글을 읽어보세요 우편 아니면 저한테 물어보세요.

우리는 사용할 수 있습니다 git svn clone 아래와 같이 명령합니다.

  • svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

위 명령은 SVN 커밋에서 작성자 파일을 생성합니다.

  • svn log --stop-on-copy <SVN_URL>

위 명령은 SVN 프로젝트가 생성될 때 첫 번째 개정 번호를 제공합니다.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

위 명령은 로컬에 Git 저장소를 생성합니다.

문제는 분기와 태그를 푸시로 변환하지 않는다는 것입니다.수동으로 수행해야 합니다.예를 들어 지점의 경우 다음과 같습니다.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

태그의 경우:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

이제 마스터, 브랜치, 태그를 원격 Git 저장소에 푸시하세요.

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

svn2git 유틸리티

svn2git 유틸리티는 분기 및 태그에 대한 수동 작업을 제거합니다.

명령을 사용하여 설치 sudo gem install svn2git.그 후 아래 명령을 실행하세요.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

이제 브랜치, 태그를 나열하고 쉽게 푸시할 수 있습니다.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

20개의 브랜치와 태그가 있다고 상상해 보세요. 분명히 svn2git은 많은 시간을 절약해 줄 것이며 이것이 제가 기본 명령보다 더 좋아하는 이유입니다.네이티브를 둘러싼 멋진 래퍼입니다. git svn clone 명령.

전체 예를 보려면 내 블로그 항목.

TortoiseGit이 이를 수행합니다.이 블로그 게시물을 참조하세요. http://jimmykeen.net/articles/03-nov-2012/how- migration-from-svn-to-git-windows-using-tortoise-clients

네, 링크로 답변하는 것이 좋은 방법은 아니지만 해결책이 된다는 건 압니다. 그렇죠?

나는 이것을 강력히 추천한다 짧은 스크린캐스트 시리즈 방금 발견했습니다.저자는 기본 작업을 안내하고 몇 가지 고급 사용법을 보여줍니다.

SourceTree를 사용하는 경우 앱에서 직접 이 작업을 수행할 수 있습니다.파일로 이동 -> 새로 만들기/복제 후 다음을 수행합니다.

  1. "소스 경로/URL"에 원격 SVN URL을 입력합니다.
  2. 메시지가 나타나면 자격 증명을 입력하세요.
  3. "대상 경로"로 로컬 폴더 위치를 입력합니다.
  4. 이름을 지어주세요.
  5. 고급 옵션에서 "유형의 로컬 리포지토리 작성"의 드롭 다운에서 "git"을 선택하십시오.
  6. 선택적으로 복제할 개정판을 지정할 수 있습니다.
  7. 클론을 누르세요.

SourceTree에서 저장소를 열면 커밋 메시지도 마이그레이션된 것을 볼 수 있습니다.

이제 리포지토리 -> 리포지토리 설정으로 이동하여 새 원격 리포지토리 세부 정보를 추가하세요.원하는 경우 SVN 원격을 삭제합니다(저는 "구성 파일 편집" 옵션을 통해 이 작업을 수행했습니다.

준비가 되면 코드를 새 원격 저장소에 푸시하고 자유롭게 코딩하세요.

을 위한 GitLab SVN에서 마이그레이션한 방법에 대한 요지를 여기에 게시했습니다.

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

SVN에서 GitLab으로 마이그레이션하는 단계

설정

  • SVN은 다음에서 호스팅됩니다. svn.domain.com.au.
  • SVN은 다음을 통해 액세스할 수 있습니다. http (다른 프로토콜도 작동해야 합니다).
  • GitLab은 다음에서 호스팅됩니다. git.domain.com.au 그리고:
    • 네임스페이스를 사용하여 그룹이 생성됩니다. dev-team.
    • 하나 이상의 사용자 계정이 생성되어 그룹에 추가되고 마이그레이션에 사용되는 계정에 대한 SSH 키가 있습니다(다음을 사용하여 테스트). ssh git@git.domain.com.au).
    • 프로젝트 favourite-project 에서 생성됩니다. dev-team 네임스페이스.
  • 파일 users.txt 다음 형식의 관련 사용자 세부 정보를 한 줄에 한 명의 사용자로 포함합니다. username = First Last <address@domain.com.au>, 어디 username SVN 로그에 제공된 사용자 이름입니다.(자세한 내용은 참조 섹션의 첫 번째 링크, 특히 Casey 사용자의 답변을 참조하세요.)

버전

  • 전복 버전 1.6.17(r1128011)
  • 자식 버전 1.9.1
  • GitLab 버전 7.2.1 ff1633f
  • 우분투 서버 14.04

명령

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

그게 다야!GitLab 웹 UI에서 프로젝트 페이지를 다시 로드하면 모든 커밋과 파일이 나열된 것을 볼 수 있습니다.

노트

  • 알 수 없는 사용자가 있는 경우 git svn clone 명령이 중지됩니다. 이 경우 업데이트됩니다. users.txt, cd favourite-project 그리고 git svn fetch 중단된 부분부터 계속됩니다.
  • 표준 trunk-tags-branches SVN 저장소의 레이아웃이 필요합니다.
  • 에 제공된 SVN URL git svn clone 명령은 바로 위 수준에서 중지됩니다. trunk/, tags/ 그리고 branches/.
  • 그만큼 git svn clone 명령은 상단의 일부 경고를 포함하여 많은 출력을 생성합니다.나는 경고를 무시했습니다.

또 다른 점은 git-svn dcommits로 git을 시도할 때 git-stash 명령이 신의 선물이라는 것입니다.

일반적인 프로세스:

  1. git repo 설정
  2. 다른 파일에 대한 작업을 수행합니다.
  3. git을 사용하여 일부 작업을 확인하기로 결정
  4. ~를 결정하다 svn-dcommit
  5. 두려운 "더티 인덱스로 커밋할 수 없습니다" 오류가 발생합니다.

해결책(git 1.5.3+ 필요):

git stash; git svn dcommit ; git stash apply

다음은 하나 이상의 SVN 저장소를 git으로 변환하고 GitHub에 푸시하는 종속성이 없는 간단한 셸 스크립트입니다.

https://gist.github.com/NathanSweet/7327535

약 30줄의 스크립트에서는 다음과 같습니다.git SVN을 사용하여 복제하고, SVN::ignore 속성에서 .gitignore 파일을 생성하고, 기본 git 저장소에 푸시하고, SVN 트렁크 이름을 마스터로 바꾸고, SVN 태그를 git 태그로 변환하고, 태그를 유지하면서 GitHub에 푸시합니다.

저는 12개의 SVN 리포지토리를 Google Code에서 GitHub로 옮기는 데 많은 어려움을 겪었습니다.Windows를 사용하는 것은 도움이 되지 않았습니다.Ruby는 내 오래된 데비안 상자에서 온갖 종류의 손상을 입었고 Windows에서 작동시키는 것은 농담이었습니다.다른 솔루션은 Cygwin 경로에서 작동하지 못했습니다.뭔가 작동하게 된 후에도 GitHub에 태그를 표시하는 방법을 알 수 없었습니다(비밀은 --follow-tags입니다).

결국 나는 위에 링크된 두 개의 짧고 간단한 스크립트를 함께 엮었고 훌륭하게 작동했습니다.솔루션은 그보다 더 복잡할 필요가 없습니다!

나는 Windows 컴퓨터를 사용하고 있으며 기록이 있는 SVN 저장소(분기 없음)를 GIT 저장소로 전송하기 위해 작은 배치를 만들었습니다.

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

아마도 누구나 사용할 수 있을 것입니다.TMP 폴더를 생성하고 git을 사용하여 SVN 저장소를 확인하고 새 원본을 추가하고 푸시합니다.폴더를 다시 삭제합니다.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

다음과 같은 사용자 매핑이 포함된 users.txt가 여전히 필요합니다.

User1 = User One <u.1@xxx.com>

나는 Git 커뮤니티에 내 기여를 추가하고 싶었습니다.전체 가져오기를 자동화하는 간단한 bash 스크립트를 작성했습니다.다른 마이그레이션 도구와 달리 이 도구는 jGit 대신 기본 git을 사용합니다.이 도구는 개정 기록이 크거나 Blob이 큰 리포지토리도 지원합니다.github을 통해 이용 가능합니다:

https://github.com/onepremise/SGMS

이 스크립트는 SVN에 저장된 프로젝트를 다음 형식으로 변환합니다.

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

이 체계도 널리 사용되며 지원됩니다.

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

각 프로젝트는 프로젝트 이름별로 동기화됩니다.

Ex: ./migration https://svnurl.com/basepath project1

전체 저장소를 변환하려면 다음 구문을 사용하십시오.

Ex: ./migration https://svnurl.com/basepath .

Subversion과 함께 Git을 효과적으로 사용하기 git-svn에 대한 간단한 소개입니다.기존 SVN 리포지토리의 경우 git-svn을 사용하면 이 작업이 매우 쉬워집니다.새 저장소를 시작하는 경우 먼저 빈 SVN 저장소를 만든 다음 git-svn을 사용하여 가져오는 것이 반대 방향으로 진행하는 것보다 훨씬 쉽습니다.새 Git 리포지토리를 만든 다음 SVN으로 가져올 수 있지만 이는 약간 고통스럽습니다. 특히 Git을 처음 사용하고 커밋 기록을 보존하려는 경우 더욱 그렇습니다.

Windows용 Ruby 설치 프로그램을 다운로드하고 최신 버전을 설치하세요.경로에 Ruby 실행 파일을 추가하세요.

  • svn2git 설치
  • 시작 메뉴 -> 모든 프로그램 -> Ruby -> Ruby로 명령 프롬프트 시작
  • 그런 다음 "gem install svn2git"을 입력하고 다음을 입력하세요.

    Subversion 저장소 마이그레이션

  • Ruby 명령 프롬프트를 열고 파일을 마이그레이션할 디렉터리로 이동합니다.

    그런 다음 svn2git http://[도메인 이름]/svn/ [저장소 루트]

  • 프로젝트 코드 크기에 따라 프로젝트를 Git으로 마이그레이션하는 데 몇 시간이 걸릴 수 있습니다.

  • 이 주요 단계는 아래 언급된 Git 저장소 구조를 만드는 데 도움이 됩니다.

    svn (/project_components) 트렁크 -> git mas

원격 저장소를 생성하고 변경 사항을 푸시합니다.

GitHub에는 수입업체가 있습니다.저장소를 생성한 후에는 해당 URL을 통해 기존 저장소에서 가져올 수 있습니다.해당되는 경우 자격 증명을 요청하고 거기에서 이동합니다.

실행 중 작성자를 찾고 GitHub의 사용자에게 간단히 매핑할 수 있습니다.

나는 지금 그것을 몇몇 리포지토리에 사용했는데, 꽤 정확하고 훨씬 빠릅니다!~4000개의 커밋이 있는 저장소를 만드는 데 10분이 걸렸고, 그 후 내 친구는 4일이 걸렸습니다!

여기에 대한 몇 가지 답변은 다음을 참조하십시오. https://github.com/nirvdrum/svn2git, 그러나 대규모 저장소의 경우 속도가 느릴 수 있습니다.사용해 보았는데 https://github.com/svn-all-fast-export/svn2git 대신 이는 이름은 정확히 같지만 KDE를 SVN에서 Git으로 마이그레이션하는 데 사용된 도구입니다.

설정하는 데 약간 더 많은 작업이 필요하지만 완료되면 다른 스크립트가 몇 시간을 소비한 변환 자체에는 몇 분이 걸렸습니다.

이 목표를 달성하는 방법에는 여러 가지가 있습니다.나는 그 중 일부를 시도했고 Windows OS에 설치된 git 및 svn만으로 실제로 작동하는 것을 발견했습니다.

전제 조건:

  1. Windows의 git (나는 이것을 사용했습니다) https://git-scm.com/
  2. 콘솔 도구가 설치된 svn (저는 거북이 svn을 사용했습니다)
  3. SVN 저장소의 덤프 파일입니다.svnadmin dump /path/to/repository > repo_name.svn_dump

최종 목표를 달성하기 위한 단계(기록이 있는 모든 저장소를 git으로 이동하고 먼저 로컬 git으로 이동한 다음 원격으로 이동)

  1. REPO_NAME_FOLDER 디렉터리에 빈 저장소를 만듭니다(콘솔 도구 또는 tortoiseSVN 사용).cd REPO_NAME_PARENT_FOLDER, dumpfile.dump를 REPO_NAME_PARENT_FOLDER에 넣습니다.

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump 이 작업을 기다리십시오. 시간이 오래 걸릴 수 있습니다.

  3. 이 명령은 자동으로 실행되므로 두 번째 cmd 창을 엽니다. svnserve -d -R --root REPO_NAME_FOLDER 왜 file:///를 사용하지 않는가......?다음 명령이 실패하게 됩니다. Unable to open ... to URL:, 답변 덕분에 https://stackoverflow.com/a/6300968/4953065

  4. 새 폴더 SOURCE_GIT_FOLDER 만들기

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn://localhost/ 이 작업을 기다립니다.

마지막으로 우리는 무엇을 얻었습니까?

로컬 저장소를 확인해 보겠습니다.

git log

이전 커밋을 보셨나요?그렇다면 - 알았어

이제 소스와 이전 svn 기록이 포함된 완전한 기능을 갖춘 로컬 git 저장소를 갖게 되었습니다.이제 일부 서버로 이동하려면 다음 명령을 사용하십시오.

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

제 경우에는 저장소에 태그가 없기 때문에 태그 명령이 필요하지 않습니다.

행운을 빌어요!

svn 하위 모듈/폴더 'MyModule'을 태그나 분기 없이 기록이 있는 git으로 변환합니다.

svn 무시 목록을 유지하려면 1단계 이후에 위의 설명을 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top