2009-09-14 6 views
3

Git 저장소 (G)를 SVN 저장소 (S)로 내보내려고합니다. S은 표준 레이아웃 (브랜치/태그/트렁크)으로 초기화되었으며 G에는 지금까지 개발 내역이 있습니다. 나는 Google Open Source Blog에있는 조언을 따랐다. 수출은 어떻게 되는가? GS이 효과가있다. 기본적으로 블로그는 빈 디렉토리에 자식 - svn을 복제S에 권장 는 임시로G를 가져옵니다. 브랜치와 리베이스이 "master"가되어 두 번째 Git 저장소가된다 (G ').Git 저장소의 루트에 단일 커밋을 추가하거나 Git을 Subversion으로 내 보내기

소스 제어가 아닌 파일이나 원본에서 사용할 수없는 분기를 포기하고 싶지 않습니다. 그래서 나는 G '으로 계속 일하고 싶지 않고 G으로 계속 일하고 싶지 않습니다. 레이아웃 커밋을 나타내는 새로운 커밋을 다시 가져 오는 방법이 있습니까? S? 나는 병합에 성공하지 못했습니다.G ' 안으로 G (물론 공통 조상은 없습니다).

+0

좋은 질문입니다. gid를 사용하는 방법을 배우려는 시도와 동시에 svn과 통합하는 것이 아주 혼란 ​​스럽습니다. – Jacob

답변

3

당신은 G 병합 할 수 있어야한다 '조상을 무시하고 그 커밋 만들어 git merge --strategy=ours, 즉를 사용 및 GG의 나무 사용'을하지만 모두가 부모로 커밋이 나타납니다. 기록에는 각 커밋의 사본이 두 개 포함될 것이므로 결과는 다소 추한 것입니다. 그러나 G에서 계속 작업 할 수 있어야합니다.

+0

나는 더 나은 것을 기대하고있었습니다. [1]은 역사를 완벽하게 보존합니다 - 단지 필요한 것은 git-svn이 * S *를 인식해야하는 단일 커밋뿐입니다. git 툴킷의 풍부함을 감안할 때 이것이 내 역사 앞에 덧붙일 수 있어야합니다. – yawn

+0

커밋의 ID는 부모의 신원에 따라 다르므로 선행 적으로 엄격하게 말하면 불가능합니다. 내가 생각할 수있는 유일한 방법은 S.에 다른 모든 브랜치를 리베이스하는 것입니다. – legoscia

+0

최선의 노력을 인정 받아 :-) – yawn

2

초기 커밋을 추가하는 쉬운 방법이 있는지 잘 모르겠지만 SVN 레이아웃이 처음부터 있었던 것처럼 보이게 만드는 매우 쉬운 방법이 있습니다.

당신은 모든 파일이 커밋 처음부터 시작하는 SVN "트렁크"디렉토리에 존재하도록, 역사를 다시 쓰는 git filter-branch을 사용할 수 있습니다 : 당신은 유사 태그와 지점 디렉토리에 파일을 이동할 수

git filter-branch --tree-filter 'mkdir trunk; git ls-files | xargs -I {} mv {} trunk' 

, 원한다면 어떤 파일을 옮길 지 결정하는 방법은 분기가 무엇인지, 아니면 태그를 히스토리에 추가 할 것인지에 달려있다.

+0

매우 흥미 롭습니다! 나는 아침에이 첫 번째 것을 시도 할 것이다! – yawn

+0

나는 당신의 대답을 제대로 읽지 못했다. 내가 실제로 한 것은 레이아웃 자체가 아니라 git-svn의 초기 레이아웃을 나타내는 커밋이다. 그럼에도 불구하고 +1에 대한 필터 - 지점. – yawn

+0

@yawn : SVN 표준을 만드는 것이 어떨까요? 레이아웃을 새로운 (그렇지 않으면 비어있는) Git repo (repo "T"라고 부르 자)에서 커밋 한 다음 T의 마스터를 G로 가져옵니다. 그런 다음 G에서 FETCH_HEAD의 마스터를 리베이스 했습니까? 계속 유지하고자하는 G의 다른 브랜치들도 새로운 "초기"커밋의 강하를 받으면 리베이스해야 할 것입니다 (각 브랜치에 대해 원래베이스에 해당하는 새로운 커밋을 찾아야합니다). 하지만, 지점). –

관련 문제