2012-05-18 2 views
6

SVN 저장소를 여러 git repos로 변환하려고합니다. 지금까지 나는 SVN의 각 프로젝트에 대해 git svn clone svn_repo_project_path을 사용 해왔다. 나는 자식이 svn 복사 작업을 따르지 않는 것으로 보이기 때문에 결과 기록이 예상보다 훨씬 간단합니다. 내 SVN의 환매 특약이처럼 보였다 가정 :git으로 변환 할 때 svn copy history 유지

루트

  • B
  • C
  • 부모 - PROJ
    • B
    • C
프로젝트 b

c 최근 결국 루트 아래에 그들의 오래된 위치에서 삭제의 의도와 구조 조정 노력의 일환으로 parent-proj에서 복사되었습니다. 내가 수행 할 때 git svn clone http://svnhost/parent-proj 결과 git repo가 ​​이동하기 전에 /b/c에서 발생한 모든 기록이 누락되었습니다.

이것은 git-svn의 제한 사항입니까, 아니면이 기록을 내 저장소에 표시 할 수있는 방법이 있습니까? 내 제한된 연구에서 Getting complete history of an SVN repo that's been renamed using git-svn에 설명 된대로 filter-branch 명령을 사용하는 것이 가능할 수도 있지만 내 경우에는 여러 가지 부모가있을 수 있습니다. 먼저 전체 repo를 복제 한 다음 새로운 repo를 필터 분기를 사용하여 분리 할 수 ​​있었습니까? 더 나은 접근 방법이 될 수 있습니까?

+0

디렉토리를 이동할 때에도 모든 파일의 비난 기록이 나옵니다. 그리고 내 'git svn clone'도 복제 된 디렉토리 외부의 프로젝트를 추적했습니다 (원래는 어디에서 유래 했습니까). –

+2

@ShadowCreeper : 당신은 힘내 어떤 버전을 사용하고 계셨습니까? 패트릭 (Patrick)과 같은 문제가 있습니다. – Pylinux

+0

복제 된 버전이 확실하지 않습니다. 나는 그것이 원래 1.7 버전 (debian wheezy의 최신 버전으로 몇 달 전 이었음)이라고 생각한다. 그러나 최근에 v1.8.4를 사용하여 지저분한 역사를 가진 프로젝트 중 하나를 재발행했으며 동일한 동작을 보였습니다 (일부 SHA는 완전히 다른 나무 임). 어쩌면 SVN 서버 버전이 더 중요할까요? 나는 그것이 여전히 1.7에 있다고 믿는다. –

답변

0

인 경우 b 또는 c에 대한 사전 복사 - 부모 프로젝트 기록은 제공되지 않습니다. git svn은 제공된 기본 경로를 SVN을 처리하는 데 관심이있는 가장 얕은 점으로 해석하므로 Git이이를 위해 커밋합니다. bc 아래의 커밋이이 경로 외부에 있으므로 git svn은 미러링하지 않으므로 기록을 보유 할 수 없습니다.

git svn init --no-minimize-url 옵션에 대한 설명서를 살펴 보자 (--stdlayout 사용 --branches, 또는 옵션을 --tags) 여러 디렉토리를 추적 할 때

, 자식 SVN이 연결을 시도합니다을 서브 버전 저장소의 루트 (또는 허용되는 최상위 레벨). 이 기본값을 사용하면 전체 프로젝트가 저장소 내에서 이동하는 경우 기록을 더 잘 추적 할 수 있지만 읽기 액세스 제한이있는 저장소에 문제가 발생할 수 있습니다. --no-minim-url을 전달하면 git svn이 더 높은 수준의 디렉토리에 연결하지 않고있는 그대로 URL을 허용 할 수 있습니다. 단 하나의 URL/브랜치를 추적 할 때이 옵션은 기본적으로 해제되어 있습니다 (약간 좋을 것입니다). 당신의 clone 명령 이후

git svn 단지 클론 해당 경로를 포함하고 아래로 커밋, (당신은 복잡한 멀티 프로젝트 또는 비 표준 레이아웃을 가지고 아마 때문에) 여러 가지를 지정하지 않습니다. 코멘트의 Shadow Creeper는 -s 또는 --stdlayout 옵션을 사용했기 때문에 일부 기록이 보존 된 이유를 설명 할 수 있습니다.

일회성 변환 인 경우 (SVN에서 Git으로 단방향 이동) 전체 저장소를 복제해야하며, Git에서 원하는 방식으로 보이게하기위한 좋은 옵션이 있습니다. to, 역사적인 가지와 꼬리표의 설립을 포함하여. filter-branch을 실행하려는 동기가 저장소 공간을 저장하는 것이라면, 이것이 실제로 여러분에게 뭔가를 저장할 것이고, 귀찮은 일이 될만한 가치가 있는지 확인하십시오. 힘내는 저장과 함께 매우 효율적이다.

Git 클론에서 히스토리 검색을 무시할 때주의해야 할 마지막주의 사항. git log -C --follow <file-path>을 사용하여 파일의 히스토리를 찾고, Git은 대개 이름 바꾸기 및 사본을 포함하는 히스토리를 찾고 제공합니다. 디렉토리에 대해 같은 것을 기대하지 마십시오. parent-proj/b. Git은 blob (파일), 나무 (blob), 커밋 및 부모 커밋을 추적하지만 SVN과 같은 방식으로 디렉토리 또는 디렉토리 복사본을 처리하지 않습니다.

관련 문제