2016-07-15 5 views
1

잠시 동안 GitHub에있는 프로젝트가 있지만 이전에 svn에서 마이그레이션되었습니다. 그것이 처음 마이그레이션되었을 때 SVN 히스토리는 Git으로 옮겨지지 않았습니다. 프로젝트를 설정 한 후 SVN 기록을 Git으로 복사/가져 오기/복제/이동할 수있는 방법이 있습니까?SVN에서 기존 Git 프로젝트로 내역 가져 오기

+0

Subversion 기록을 기반으로 새 복제본을 만든 다음 이러한 변경 사항을 기존 Git 저장소에 병합 할 수 있습니다. Subversion 히스토리를 기존 Git 히스토리의 기반으로 소개 할 수는 없지만 이제는 병합 할 병력으로 사용할 수 있습니다. – poke

+0

@poke 왜 그는 할 수 없습니까? 물론 그는 그렇습니다. 물론 그는 게시 된 기록을이 코드로 다시 작성하고 repo를 사용하는 모든 사람은 항상 변경된 게시 된 기록을 사용하여 모든 지회를 수동으로 리베이스하여 복구해야합니다. – Vampire

+0

@Vampire 그는 역사를 다시 쓰지 않고는 안된다. 프로젝트가 잠시 동안 활성화 되었다면, 역사를 그대로 유지하는 것이 좋습니다. – poke

답변

1
을 불평 할 것이다

git-svn이 아니며 리포지토리의 1 회성 변환에 적합한 도구입니다. Git을 기존 SVN 서버의 프론트 엔드로 사용하려는 경우 훌륭한 도구이지만 일회성 변환의 경우 이 아닌git-svn을 사용해야하지만 svn2git은이 사용 사례에 훨씬 적합합니다.

svn2git이라는 pleny 도구가 있는데, 아마도 가장 좋은 도구는 https://github.com/svn-all-fast-export/svn2git의 KDE입니다. 그 svn2git 도구를 사용하는 것이 좋습니다. 내가 사용할 수있는 최선의 방법이며, 규칙 파일을 통해 할 수있는 일에 매우 유연합니다.

svneverever에서 http://blog.hartwork.org/?p=763까지의 기록은 Git으로 마이그레이션 할 때 SVN 저장소의 기록을 조사하는 훌륭한 도구입니다.

당신이 적절한 힘내의 repo에 SVN의 REPO를 변환 한 후

, 기존의 repo에 원격으로 새로 생성 된 환매 특약을 추가하고 커밋을 가져옵니다. 그런 다음 git replace을 사용하여 새 기록의 첫 번째 커밋을 이전 기록의 마지막 커밋으로 바꿉니다. 이것을 영구 보존하려면 git filter-branch을 사용하여 대체 영구 보존 할 수 있습니다.

게시 된 기록을 다시 쓰고 이전 기록을 기반으로 한 지사를 가지고있는 사람은 git rebase 설명서에 설명 된 것처럼 기록 변경 사항을 복구해야한다는 점에 유의하십시오. 이 작업을 원하지 않는다면 새로 마이그레이션 된 저장소를 Git 저장소로 끌어 와서 SVN 기록에서 새 분기를 만들면됩니다.그런 다음 기술적으로는 괜찮은 여러 개의 루트 커밋과 독립적 인 이력을 가지지 만 파일의 기록은 여전히 ​​삭제됩니다.

1

가능하지만 이미 저장소를 복제 한 모든 사용자에게 영향을 미칩니다. 그만한 가치가 있는지 먼저 결정해야합니다. 그렇지 않은 경우

, 그냥 역사가 검색되면

이 더 가고 싶은 경우, 추가 ... 자식 - svn을 다른 자식 저장소에서 소스 코드의 역사 거기에 그것을 유지와 복제 이 저장소는 실제 저장소에있는 원격 저장소로 가져와 가져올 수 있습니다.

git fetch --all 

일단 완료되면 분리 된 기록이 있어야합니다.

그런 다음 'git replace'를 사용하여 방금 가져온 지점의 마지막 저장소로 새 저장소의 첫 번째 커밋을 바꿉니다.

https://git-scm.com/docs/git-replace

그리고 마지막으로, 확실히 역사를 다시 쓰는 것, '자식 필터 지점'을 사용합니다.

당신이 좋아하는 뭔가 새로운 역사를 밀어해야합니다 : 복제 또는 모든 역사를 가져 오기해야합니다

git push origin --all 

그리고 다른 모든 개발자 ... 그리고 ;-)

+0

조언 해 주셔서 감사합니다. 현재에는 repo의 복제본이 몇 개 밖에 없으므로 제어가 가능합니다. 비슷한 것을 할 계획입니다. 내 생각은 svn을 자식으로 변환 한 다음이 repo를 기존 repo의 한 지점으로 병합 한 다음 기존 repo의 마스터를 리베이스하는 것입니다. 그게 효과가 있다고 생각하니? – mattsun

+0

정신적으로 2 가지 해결책은 동일합니다. (병합으로 말하면 '설명'과 같이 '가져 오는 것'이라고 말하지 않는 것이 좋습니다. 그렇지 않으면 당신은 곧장 지옥으로 갈 것입니다. :()하지만 내 것이 더 쉽습니다. ... – Philippe

관련 문제