it-swarm-ko.tech

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

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

나는 그것이 그렇게 단순하지 않을 것이라고 기대하지 않으며, 나는 그것을 하나의 명령으로 기대하지 않는다. 그러나 저는이 사례를 통해 어떤 단계를 취해야 하는지를 설명하기 위해 아무것도 설명하지 않기를 기대합니다.

1453
Milan Babuškov

마법:

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

힘내와 SVN은 매우 다르게 작동합니다. Git을 배울 필요가있다. SVN 업스트림에서 변경 한 내용을 추적하려면 git-svn를 배워야한다. git-svn 맨 페이지에는 좋은 예제 섹션이 있습니다.

$ git svn --help
513
jfm3

SVN 사용자를 Git에 매핑하기위한 사용자 파일 (예 : users.txt)을 만듭니다.

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

이 한 줄을 사용하여 기존 SVN 저장소에서 템플릿을 만들 수 있습니다.

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

SVN이 파일에없는 누락 된 SVN 사용자를 찾으면 SVN이 중지됩니다. 그러나 그 후에는 파일을 업데이트하고 중단 한 부분부터 픽업 할 수 있습니다.

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

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

이 명령은 dest_dir-tmp에 새 Git 저장소를 만들고 SVN 저장소를 가져옵니다. "--stdlayout"플래그는 일반적인 "trunk /, branches /, tags /"SVN 레이아웃을 가지고 있다는 것을 의미합니다. 레이아웃이 다른 경우 --tags, --branches, --trunk 옵션에 익숙해집니다 (일반적으로 git svn help).

모든 일반적인 프로토콜은 허용됩니다 : svn://, http://, https://. URL은 http://svn.mycompany.com/myrepo/repository 와 같은 기본 저장소를 대상으로해야합니다. 그건 not/trunk, /tag 또는 /branches를 포함해야합니다.

이 명령을 실행 한 후에는 작업이 "hanging/freezed"인 것처럼 보이며 새 저장소를 초기화 한 후 오랜 시간 동안 걸릴 수 있다는 것은 매우 정상입니다. 결국에는 마이그레이션 중임을 나타내는 로그 메시지가 나타납니다.

또한 --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

다른 원격 브랜치를 저장소에 보관하려면 수동으로 각각에 대해 로컬 브랜치를 작성해야합니다. (Skip trunk/master.) 이렇게하지 않으면 마지막 단계에서 분기가 복제되지 않습니다.

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 저장소에 GIT-SVN 저장소 복제 :

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
1512
cmcginty

Subversion 저장소를 Git 저장소로 완전히 마이그레이션 . 먼저 Subversion 커밋 작성자 이름을 힘내 커미터로 매핑하는 파일을 만들어야합니다 (예 : ~/authors.txt).

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

그런 다음 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 저장소가 원하는 저장소와 동일한 컴퓨터에있는 경우 init 단계에 다음 구문을 사용할 수 있습니다.

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

내가 svn2git 스크립트를 사용 그리고 매력처럼 작동합니다.

69

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

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

로컬 저장소를 초기화하십시오.

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

버전 가져 오기 시작까지 얼마나 남았는지 표시하십시오.

git svn fetch -r42

(또는 모든 rev에 대해 "git svn fetch"

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

git svn rebase

Gitk로 가져 오기 결과를 확인할 수 있습니다. Windows에서 작동하는지, OSX 및 Linux에서 작동하는지 잘 모르겠습니다.

gitk

SVN Repo를 로컬에서 복제 할 수있게되면 중앙 집중식 Git repo에 푸시하여보다 쉽게 ​​협업 할 수 있습니다.

먼저 비어있는 원격 저장소를 만듭니다 (아마도 GitHub ?) :

git remote add Origin [email protected]:user/project-name.git

그런 다음 선택적으로 주 브랜치를 동기화하여 풀 작업이 자동 마스터와 로컬 마스터를 병합합니다. 둘 다 새 작업을 포함 할 때 :

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

그 후 원격 지점을 다루는 데 도움이되는 내 고유의 git_remote_branch 도구를 사용해 보는 것이 좋습니다.

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

최신 버전의 후속 조치 : " git_remote_branch와 공동 작업하는 시간 "

57
webmat

Subversion에서 Git으로 (또는 동시에 사용하기 위해) 원활하게 마이그레이션 할 수있는 새로운 솔루션이 있습니다 : SubGit .

나는이 프로젝트에 직접 참여하고있다. SubGit을 리포지토리에 사용합니다. 일부 팀원은 힘내와 서브 버전을 사용하며, 지금까지는 매우 잘 작동합니다.

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

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

그 다음 svn_repos/.git에있는 Git 저장소를 가져 와서 복제하거나 Subversion과이 새로운 Git 저장소를 계속 사용하십시오. SubGit은 둘 다 항상 동기화 상태를 유지하는지 확인합니다.

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

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

SubGit 를 사용하면 Subversion을 필요한만큼 오래 유지하면서 (예 : 이미 구성된 빌드 도구의 경우) 순수 Git (git-svn이 아닌)으로 마이그레이션하고 사용하기 시작할 수 있습니다.

희망이 도움이!

30
Alexander Kitaev

Official git-svn 맨 페이지 를 참조하십시오. 특히 "기본 예제"아래를 살펴보십시오.

Subversion에서 관리하는 프로젝트 전체를 추적 및 제공 (트렁크, 태그 및 분기로 완성) :

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

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

13
kdahlhaus

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 , mama를 사용하고 있습니다. 자식 - svn 날 블루 스크린의 죽음 . 그냥 끊임없이. 그리고 git-svn은 Git의 " 파일 이름이 너무 깁니다 "치명적인 오류로 인해 지루합니다.

STEPS

1. SubGit 다운로드

2. 마이그레이션 및 업데이트 명령을 준비하십시오.

우리가 Windows에서 사용한다고 가정 해 봅시다 (Linux로 포팅하는 것은 간단합니다).
SubGit의 설치 bin 디렉토리 (subgit-2.X.X\bin)에 두 개의 .bat 파일을 만듭니다.

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

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

"시작"명령은 선택 사항입니다 (Windows). SubGit 완료 후 열리는 셸을 시작하고 왼쪽으로 오류를 볼 수 있습니다.

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

(브랜치 또는 SVN에 여러 개의 브랜치/태그 폴더가있는 경우, 더 자세한 SubGit 접근 )를 사용하는 것이 좋습니다.

팁 1 : --minimal-revision YourSvnRevNumber를 사용하면 사물이 어떻게 끓는지를 볼 수 있습니다 (어떤 종류의 디버깅). 해결 된 저자 이름이나 이메일을 보는 것이 특히 유용합니다.
또는 마이그레이션 기록 깊이를 제한하십시오.

팁 2 : 마이그레이션이 중단 될 수 있습니다 (Ctrl + C) 다음의 갱신 명령/파일의 실행에 의해 복원된다.
나는 큰 저장소에 대해 이렇게하는 충고를하지 않습니다. "메모리 부족 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 - 500MB 1073741824 - 1GB 등.

문제 해결 인증서 문제 . 귀하의 자식 서버가 깨진 인증서를 사용하는 경우.

나는 인증서 .

또한 Git 서버에는 수정해야 할 요청량 제한 이있을 수 있습니다.

  1. 모든 이전을 푸시 팀의 원격 Git 저장소에.

로컬 Git으로 실행 :

git Push Origin --mirror

(git Push Origin '* : *' 오래된 Git 버전 용)

만약 당신이 다음을 얻으면 : error : 자식을 생성 할 수 없다 : 그런 파일이나 디렉토리가 없다 ... 내 저장소의 전체 레크리에이션은이 오류를 해결한다. 30 시간). 다음 명령을 시도해 볼 수 있습니다.

git Push Origin --all
git Push Origin --tags

또는 재 설치 Git ( 나를 쓸모 없게 만듭니다 ). 또는 모든 태그에서 분기를 만들고 밀어 낼 수 있습니다. 또는, 또는 ...

13
it3xl

리 포지션

복잡한 경우에는 Eric S. Raymond 에 의한 reposurgeon이 선택 도구입니다. SVN 외에도 fast-export 형식과 CVS 를 통해 다른 많은 버전 제어 시스템을 지원합니다. 저자는 EmacsFreeBSD 와 같은 고대 저장소의 성공적인 변환을보고합니다.

이력이 긴 저장소 레이아웃의 경우에도 툴은 거의 완벽한 변환을 목표로 함 (예 : SVN의 svn:ignore 속성을 .gitignore 파일로 변환). 많은 경우 다른 도구를 사용하는 것이 더 쉬울 수 있습니다.

reposurgeon 명령 행의 문서를 살펴보기 전에 변환 프로세스를 단계별로 수행하는 우수한 DVCS 마이그레이션 안내서 를 읽으십시오.

10
krlmlr

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

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

이 도구 - https://bitbucket.org/atlassian/svn-migration-scripts -는 다른 것들 중에서도 authors.txt를 생성하는 데 정말로 유용합니다.

7
Andrew B

설치해야합니다.

git
git-svn

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

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

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

로컬 Subversion 체크 아웃의 루트에서 다음 명령을 실행하십시오 :

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

그러면 모든 로그 메시지를 포착하고 사용자 이름을 뽑아 내고 중복 된 사용자 이름을 제거하고 사용자 이름을 정렬하여 "authors-transform.txt"파일에 저장합니다. 이제 파일의 각 행을 편집하십시오. 예를 들어 convert :

jwilkins = jwilkins <jwilkins>

이것을

jwilkins = John Albin Wilkins <[email protected]>

2. Subversion 저장소를 복제하려면 git-svn

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

이것은 표준 git-svn 변환을 수행하고 (1 단계에서 작성한 authors-transform.txt 파일 사용) git 저장소를 홈 디렉토리의 "~/temp"폴더에 두십시오.

3. 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. 저장소를 베어 저장소로 푸시

먼저 베어 메트로 저장소를 만들고 기본 분기를 svn의 "trunk"분기 이름과 일치시킵니다.

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. "trunk"브랜치를 "master"로 이름 변경

주요 개발 브랜치는 Subversion에있는 이름과 일치하는 "트렁크"로 명명됩니다. 다음과 같이 Git의 표준 "master"브랜치로 이름을 바꾸고 싶을 것이다.

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

6. 가지와 꼬리표 정리

git-svn은 Git에서 Subversions 태그를 모두 "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로 시작하는 아주 긴 명령에 대한 2 차 프롬프트를 제공 할 것입니다.

7
Valarpirai

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 <[email protected]>";
done
_

이를 사용하여 git config 속성 _user.name_ 및 _user.email_를 사용하여 개발자가 설정 한 svn 사용자 이름을 사용자 이름 및 전자 메일에 매핑하는 authors 파일을 만듭니다 (참고 : 일치하는 이메일 만있는 GitHub와 같은 서비스이면 충분합니다).

그런 다음 git svn svn 저장소를 git 저장소로 복제하여 매핑에 대해 알려주십시오.

_git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot_

Git svn은 존재하는 모든 태그 또는 분기에 대한 모든 개정판을 개별적으로 체크 아웃하므로 매우 오래 걸릴 수 있습니다. (SVN의 태그는 실제로 브랜치이므로 Git에서와 같이 끝납니다). 필요하지 않은 SVN에서 오래된 태그와 분기를 제거하여 속도를 높일 수 있습니다.

동일한 네트워크 또는 동일한 서버의 서버에서 이것을 실행하면 실제로 속도를 높일 수 있습니다. 또한 어떤 이유로이 프로세스가 중단되면 can 사용하여 다시 시작할 수 있습니다

_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 이상이 필요합니다.

7
thoutbeckers

GitHub에는 이제 SVN 저장소에서 가져 오는 기능이 있습니다. . 나는 그것을 결코 시도하지 않았다.

6
webmat

Svn 태그를 git 태그로 변환하고 svn 분기를 git 분기로 변환하는 것을 포함하여 svn을 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 가져 오기 반복

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 [email protected]:aUser/aProjectName.git
git Push newrepo refs/heads/*
git Push --tags newrepo

더 자세한 정보가 필요하면 my post 를 읽어보십시오.

5
Pablo Belaustegui

아래와 같이 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 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 명령에 대한 멋진 래퍼입니다.

전체 예를 보려면 내 블로그 항목 을 참조하십시오.

5
Pankaj

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

그래, 링크로 대답하는 것은 훌륭하지 않지만 해결책이라고 생각해?

4
CAD bloke

GitLab users 나는 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 [email protected]를 사용하여 테스트).
    • 프로젝트 favourite-projectdev-team 네임 스페이스에 만들어집니다.
  • users.txt 파일에는 username = First Last <[email protected]> 형식의 줄마다 사용자 한 명과 관련된 사용자 세부 정보가 들어 있습니다. username은 SVN 로그에 지정된 사용자 이름입니다. (자세한 내용은 참고 문헌 섹션의 첫 번째 링크를 참조하십시오. 특히 Casey 사용자가 대답합니다).

버전

  • Subversion 버전 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 [email protected]:dev-team/favourite-project.git
git Push --set-upstream gitlab master

그게 다야! GitLab 웹 UI에서 프로젝트 페이지를 새로 고침하면 커밋과 파일이 모두 표시됩니다.

노트

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

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

  1. 원격 SVN URL을 "소스 경로/URL"로 입력하십시오.
  2. 메시지가 나타나면 자격 증명을 입력하십시오.
  3. 로컬 폴더 위치를 "대상 경로"로 입력하십시오.
  4. 이름을 지정하십시오.
  5. 고급 옵션에서 "유형의 로컬 저장소 만들기"의 드롭 다운에서 "힘내다"를 선택하십시오.
  6. 복제 할 버전을 선택적으로 지정할 수 있습니다.
  7. 클론을 누르십시오.

SourceTree에서 repo를 열면 커밋 메시지도 마이그레이션되었음을 알 수 있습니다.

이제 저장소 -> 저장소 설정으로 이동하여 새 원격 저장소 세부 정보를 추가하십시오. 원하는 경우 SVN 리모컨을 삭제하십시오 ( "Edit Config File"옵션을 통해이 작업을 수행했습니다).

준비가되었고 자유롭게 코드를 작성할 때 코드를 새로운 원격 저장소로 밀어 넣으십시오.

3
Craig Myles

나는이 짧은 시리즈의 스크린 캐스트 나는 방금 발견했다. 저자는 기본 작업을 안내하고 고급 사용법을 소개합니다.

3
ripper234

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

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

약 30 줄의 스크립트에서 : git SVN을 사용하여 복제본을 만들고, SVN :: ignore 속성에서 .gitignore 파일을 만들고, 맨손으로 저장소에 넣고, SVN 트렁크의 이름을 마스터로 변경하고, SVN 태그를 git 태그로 변환하고, GitHub로 푸시합니다. 태그를 보존합니다.

나는 수십 개의 SVN 저장소를 Google 코드에서 GitHub로 옮기기 위해 많은 고통을 겪었습니다. 그것은 내가 Windows를 사용하는 데 도움이되지 못했습니다. 루비는 오래된 데비안 상자에서 모든 종류의 깨진 내용이었고 Windows에서 작동하는 것은 농담이었습니다. 다른 솔루션은 Cygwin 경로에서 작동하지 않았습니다. 일단 내가 뭔가를 얻었더라도 GitHub에 태그를 표시하는 방법을 알아낼 수 없었습니다 (비밀은 --follow-tags입니다).

결국 나는 위에 링크 된 두 개의 짧고 간단한 스크립트를 함께 엮어서 훌륭하게 작동합니다. 해결책은 그 이상 복잡 할 필요가 없습니다!

2
NateS

제쳐두고, git-stash 명령은 git-svn 명령을 사용하여 git를 시도 할 때 신의 선물입니다.

일반적인 프로세스 :

  1. git repo 설정
  2. 다른 파일에 대해 어떤 작업을 수행하십시오.
  3. git을 사용하여 일부 작업을 확인하기로 결정했다.
  4. svn-dcommit로 결정하십시오.
  5. 두려운 "더러운 색인으로 커밋 할 수 없습니다."오류가 발생합니다.

해결책 (1.5.3 이상 필요) :

git stash; git svn dcommit ; git stash apply
2
Gregg Lind

나는 윈도우 머신을 사용 중이며 작은 일괄 처리로 역사가있는 SVN 저장소를 브랜치없이 GIT 저장소로 전송한다.

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

아마도 아무도 그것을 사용할 수 있습니다. 그것은 TMP 폴더를 만들어 git에서 SVN repo를 체크 아웃하고 새로운 Origin을 추가하고 푸시한다 ... 그리고 폴더를 다시 삭제한다.

@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 <[email protected]>
2
cljk

Git 커뮤니티에 저의 기여를 추가하기를 원했습니다. 전체 가져 오기를 자동화하는 간단한 bash 스크립트를 작성했습니다. 다른 마이그레이션 도구와 달리이 도구는 jGit 대신 native git을 사용합니다. 또한이 도구는 개정 내역이 크거나 큰 얼룩이있는 저장소를 지원합니다. 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

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

Ex: ./migration https://svnurl.com/basepath .
1
Jason Huntley

이 목표를 달성하는 데는 여러 가지 방법이 있습니다. 나는 그들 중 일부를 시도하고 실제로 윈도우 OS에 설치된 자식 및 svn과 함께 작동하는 것을 발견했다.

선수 과목 :

  1. 창문에 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 cd REPO_NAME_PARENT_FOLDER 디렉토리에 빈 저장소 (콘솔 도구 또는 tortoiseSVN 사용)를 만들고 dumpfile.dump를 REPO_NAME_PARENT_FOLDER에 넣습니다.

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

  3. 이 명령은 조용하므로 두 번째 cmd 창을 엽니 다. svnserve -d -R --root REPO_NAME_FOLDER 왜 file : /// ......을 사용하지 않는 것이 좋을까요? 원인 다음 명령은 응답 https://stackoverflow.com/a/6300968/4953065Unable to open ... to URL: 때문에 실패합니다.

  4. 새 폴더 만들기 SOURCE_GIT_FOLDER

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

마지막으로, 우리는 무엇을 얻었나요?

로컬 저장소를 확인합니다.

git log

이전 커밋을 확인 하시겠습니까? '예'인 경우 - 괜찮습니다.

이제 소스와 오래된 svn 히스토리와 함께 완전한 기능을 갖춘 로컬 자식 저장소가 있습니다. 이제, 서버로 이동하려면 다음 명령을 사용하십시오.

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

제 경우에는 태그가 필요하지 않습니다. 왜냐하면 레포에 태그가 없기 때문입니다.

행운을 빕니다!

0
Ruslan Makrenko

GitHub에는 수입업자가 있습니다. 리포지토리를 만들면 URL을 통해 기존 리포지토리에서 가져올 수 있습니다. 해당되는 경우 자격 증명을 요구하고 거기에서 가십시오.

실행되는 동안 저자를 찾을 수 있으며 GitHub의 사용자에게 매핑 할 수 있습니다.

지금은 몇 곳의 저장소에 사용했고 꽤 정확하고 훨씬 빠릅니다! ~ 4000 커밋을 가진 저장소의 경우 10 분이 걸렸고 4 일 후에 친구가되었습니다.

0
Josh Benson

효과적으로 Subversion을 사용하여 Git을 사용하면 git-svn을 쉽게 사용할 수 있습니다.) 기존 SVN 저장소의 경우 git-svn을 사용하면이 작업을 매우 쉽게 할 수 있습니다. 새 저장소를 시작하는 경우 처음 만들면 훨씬 쉽습니다. 빈 SVN 저장소를 만든 다음 반대 방향으로 진행하는 것보다 git-svn을 사용하여 가져옵니다 .Git 저장소를 새로 작성한 다음 SVN으로 가져올 수 있지만 조금 힘듭니다. 특히 Git과 희망이 없다면 더욱 그렇습니다. 커밋 내역을 보존합니다.

0
burkestar

여기에있는 몇 가지 해답은 https://github.com/nirvdrum/svn2git 를 참조하십시오. 그러나 대용량 저장소의 경우 느려질 수 있습니다. 나는 https://github.com/svn-all-fast-export/svn2git를 사용하여 시도했다 그 대신 정확하게 동일한 이름을 가진 도구이지만 KDE를 SVN에서 Git으로 마이그레이션하는 데 사용되었다.

그것을 설정하는 작업이 조금 더 많았지 만 변환이 완료되면 다른 스크립트가 몇 시간을 보냈을 때 나를 위해 변환 자체가 몇 분이 걸렸습니다.

0
Zitrax

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

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

    Subversion 저장소 마이그레이션

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

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

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

  • 이 주요 단계는 아래에 설명 된대로 Git 저장소 구조를 만드는 데 도움이됩니다.

    SVN (/ Project_components) trunk -> Git 마스터 SVN (/ Project_components) 브랜치 -> Git 브랜치 SVN (/ Project_components) 태그 -> Git 태그

원격 저장소를 만들고 변경 내용을 푸시합니다.

0
Nanda

다음 스크립트를 사용하여 모든 SVN 리포지토리 목록이있는 텍스트 파일을 읽고이를 Git으로 변환 한 다음 나중에 git clone --bare를 사용하여 맨손으로 Git 리포지토리로 변환합니다.

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt 형식은 다음과 같습니다.

repo1_name
repo2_name

Users.txt 형식은 다음과 같습니다.

(no author) = Prince Rogers <[email protected]>

www-data는 Apache 웹 서버 사용자이며 HTTP를 통한 변경 사항을 푸시하기위한 권한이 필요합니다.

0
Pedro Vicente

Svn submodule/폴더 'MyModule'을 태그 나 분기가없는 이력으로 git으로 변환.

Svn ignore list를 유지하려면 1 단계 후에 위의 주석을 사용하십시오.

0
PShetty