Subversion 저장소에서 마지막 n 개정을 git-svn 복제하는 방법은 무엇입니까?


314

문제

Subversion 저장소에서 git-svn을 사용하여 얕은 사본을 작성하는 방법, 예를 들어 마지막 세 개의 개정 만 가져 오는 방법은 무엇입니까?

git clone이 옵션을 사용하면 명령은 Git 저장소에서 마지막 n 버전을 얻을 수 있습니다 --depth, 당신은 저장소의 단순 복사본을 얻을 즉. 예:

git clone --depth 3 git://some/repo myshallowcopyrepo

git-svn에 비슷한 옵션이 있습니까?

지금까지 나의 발견

지금까지 나는 개정판을 -rN어디 N에서 가져올 지 옵션을 찾았습니다 . 예:

git svn clone -rN svn://some/repo

설명서에 따르면 사용할 가능성이 있습니다 -r$REVNUMBER:HEAD. 오류 메시지를 반환 한 마지막 3 개정을 얻으려면 다음을 시도했습니다.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

그래서 나는 HEAD~3세 번째이지만 마지막 개정 534의 실제 수로 교체 했습니다. 그것은 효과가 있었지만, 먼저 세 번째이지만 마지막 커밋의 개정 번호를 알아야합니다.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

선적 서류 비치

자식 클론

git-svn


6
내 자신의 질문에 대답 : -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(하지만 나를 위해 작동하지 않았다)
Sebastián Grignoli

지원이 이미 있기 때문에 구현 --depth하기 가 얼마나 어려울 git svn까요. 그리고 이미 서버에서 최신 버전을 찾아야합니까?
Peter Cordes

답변:


238

복제를 시작하려는 SVN 개정 번호를 지정하여 Git-SVN에서 얕은 복제본을 지정하는 가장 간단한 방법을 이미 발견했습니다 ( -r$REV:HEAD ) .

예를 들면 다음과 같습니다. git svn clone -s -r1450:HEAD some/svn/repo

Git의 데이터 구조는 DAG (directed acyclic graph)의 포인터를 기반으로하므로 n커밋을 다시 수행하는 것이 쉽지 않습니다. 그러나 SVN (따라서 Git-SVN)에서는 개정 번호를 직접 찾아야합니다.


5
앞으로 이전 개정판을 계속 복제하려면 어떻게해야합니까?
Zennichimaro 1

5
@ Zennichimaro : git-svn같은 장소에 다른 원격 포인팅을 추가 하고 git-svn fetch더 많은 나무를 얻기 위해을 사용하여 그렇게 할 수 있습니다 . 이 시점 git filter-branch에서 이전 (부분) 트리를 오른쪽 분기로 다시 보호하는 데 사용해야 합니다.
벤 잭슨

Paul은 SVN에서 Git으로 증분 마이그레이션 ( stackoverflow.com/questions/29161646/… ) 을 수행하여 최신 개정을받을 수있는 방법이
있습니까?

1
SVN은 연속적인 정수를 사용하여 개정판을 식별하여 n커밋을 다시 수행하는 것이 훨씬 간단합니다 .
harmic

-r 뒤에 공백이 없다고 생각합니다. 예를 들어 git svn clone -r 1133 : HEAD some / svn / repo
Gnana

92

거대한 Subversion 트리에서 제한된 수의 개정판을 얻기 위해 다음을 자주 사용합니다 (곧 svn 개정판 35000에 도달합니다).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

그리고 지점이 시작된 지점을 찾는 좋은 방법은 지점을 시작하고 지점 svn log에서 첫 번째 지점을 찾는 것입니다 (마지막으로 수행 할 때 나열).

svn log --stop-on-copy svn://some/repo/branch/some-branch

지금까지 모든 지점을 추적 할 때 번거 로움을 찾지 못했습니다. 복제하는 데 너무 많은 시간이 걸리고 svn과 git은 내가 원하는만큼 잘 작동하지 않습니다. 패치 파일을 만들어 다른 svn 브랜치의 git 복제본에 적용하는 경향이 있습니다.


1
나에게서 하나는 - 제가 전체의 svn의 repo 복제 가졌다 오류 128 문제를 피해 갈 도움이
이안 옥 슬리

svn log 명령은 내가 찾던 것입니다! 감사합니다
mrbrdo

1
Repos 나는 비표준 분기 및 레이아웃을 가지고 작업하므로 일반적으로 각 SVN 분기마다 로컬 Git 리포지토리를 만들고 그 사이에 cherry-pick/ rebase커밋은 추가 단계 ( push, 그런 다음 dcommit원격 저장소에서) 를 취하지 만 그만한 가치가 있다고 생각합니다.
크로노 스푼

당신이 말한 것처럼 특정 태그 / 브랜치를 복제하는 것이 더 빠를 수도 있습니다 :)
VeenarM

34

... 7 년 후, 사막에서 다니는 바람에 ...

나는 받아 들여진 대답에 만족하지 않았기 때문에 Github에서 사용할 수 있는 스크립트를 만들었습니다 . 이것들은 사용하고 싶은 사람을 도울 것입니다git svn clone 싶지만 전체 저장소를 복제하고 싶지 않고 역사 중간에 복제 할 특정 개정을 찾고 싶지 않은 (아마도 많은 저장소를 복제하고 있습니다). 여기서 우리는 마지막 N 개정을 복제 할 수 있습니다.

git svn clone마지막 50 개 개정판을 복제하는 데 사용

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

SVN 저장소에서 이전 N 개정 찾기

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

이 문제를 해결하려면 리포지토리에 약 170,000 개의 수정본이 있으며 단일 프로젝트를 수행하는 데 너무 오래 걸리고 리포지토리에 10 개가 넘는 특정 프로젝트가 있습니다. | 단지 3-4 년의 역사 만 고려하는 것.
VeenarM

1
이것을 공유해 주셔서 감사합니다!
Kai Mechel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.