2011-08-08 2 views
0

CVS 용 svn을 사용하는 프로젝트에서 작업하고 약 5-6 개월 전에 trunk에서 version_1_9_1 분기를 분기했습니다. 이제 저는 그것들을 병합해야합니다.svn 분기의 GIT 병합이 기본 파일을 생성하지 못합니다.

SVN 내 부담을 완화하기 위해, 나는 병합 자식을 원했고, 그래서에서 지침을 따랐 : http://blog.wuwon.id.au/2010/09/painless-merge-conflict-resolution-in.html

내가 다음 명령을 사용하여 결국 :

git svn clone -s hxxp://svn/repo/project project (this takes avout 20min for +30k commmits) 
git checkout -b version_1.9.1 remotes/version_1_9_1 
git checkout -b the_trunk trunk 
git merge version_1.9.1 

을하지만, 내가 할 때 ' git mergetool '을 사용하면 web.xml 파일을 만들 수 있습니다. meld가 LOCAL 및 REMOTE에 대한 대화 상자를 열지 만 BASE 파일이 없습니다.

융합에 대화 상자가 열려있는 동안, 거기에있는 파일을 확인하고 다음 목록 수 :

web.xml 
web.xml.BACKUP.12480.xml 
web.xml.LOCAL.12480.xml 
web.xml.REMOTE.12480.xml 

그래서, 내 이해도 web.xml.BASE.12480.xml가 호출 된 파일되어야한다, 그러나 그 실종.

diff3이 활성화되거나 비활성화 된 경우에도 결과는 동일합니다.

은이 복제에 문제가 있다고 생각하는 저를 이끌어 ... 그래서 클린 디렉터리에서 명령 다음 실행 :

git svn clone -s hxxp://svn/repo/project project 
gitk 
git checkout -b version_1.9.1 remotes/version_1_9_1 
gitk 
git checkout -b the_trunk trunk 
gitk 

(. Btw는 임 우분투 11.04에이 일을)

각을 나는 gitk를 돌봤을 때, 나는 모든 "svn 커밋들이 또 다른 것"이라는 평평한 "계층 구조"를 본다. 그래서 이것을 올바르게 이해한다면, "git svn clone"에 문제가 있습니다. 왜냐하면 자식은 트렁크와 branch_1.9.1에 대한 공통 조상을 찾을 수 없기 때문입니다.

누구든지이 문제로 올바른 방향을 제시 할 수 있습니까?

읽어 주셔서 감사합니다.

답변

0

문제는 svn 브랜치에서 발생했습니다. 그것은 트렁크에서 갈라져 서로 연결되어 있지 않았습니다.

내가 사용하는지 확인하려면 :

$ git svn clone -s hxxp://svn/repo/project project 
$ git checkout -b the_trunk remotes/trunk 
$ git checkout -b version_1.9.1 remotes/version_1_9_1 
$ git branch 
    master 
    the_trunk 
    version_1.9.1 
$ git merge-base the_trunk version_1.9.1 

병합 기반을 두 가지 전혀 관련이 없다고 알려줍니다 아무것도 인쇄 didnt한다.

이 문제를 해결할 수있는 방법은 여러 가지가 있습니다. 자식을 가진 아주 새로운 임 때문에, 나는 잠재적 인 GITS를 사용하기 위해 영리한 방법을 알아낼 수 없었다, 그래서 나는 종류의 무력 방법을 갔다 : version_1_9_1이 갈래 된 곳에서 내가 지난 트렁크에 커밋 검색

  1. .
  2. 심각 병합 충돌 (와
  3. 했다 재미를 트렁크에
  4. 이 병합 version_1_9_1 내용으로이 신선한 지점의 모든 컨텐츠를 대체 그 시점에서 새로운 자식 분기를 생성, 무슨 SVN에 비해 훨씬 더 쉬웠다 제안했을 것이다).

아래는 위의 5 단계를 수행하는 명령입니다 : 모든 이상

$ gitk <= to find git revision id of forked commit, lets say its 97bc8071-70e0-0310-82d1-dfb2d704a1b1 
$ git checkout the_trunk 
$ git branch fake_version_1.9.1 97bc8071-70e0-0310-82d1-dfb2d704a1b1 
$ git checkout version_1.9.1 
$ mkdir ../temp 
$ cp -r projectfiles ../temp  <= remember not to copy .git directory 
$ git checkout fake_version_1.9.1 
$ rm -r projectfiles 
$ cp -r ../temp/* . 
$ git commit -a 
$ git checkout the_trunk 
$ git merge fake_version_1.9.1 
$ git mergetool  <= google "git mergetool" for instruction to setup tool for conflicts, I used p4merge 
$ git commit -a 
$ git svn dcommit 

,이 병합 매우 행복했다. 이 두 브랜치가 서로 연결되어 있지 않아 git merge가 .BASE 파일을 생성하지 못하게하는 데는 시간이 걸렸습니다. 가짜 지점 허용 자식을 생성하는 병합을하게하는 .BASE 파일을 생성하기 위해 훨씬 더 쉽게 : 총 파일 변경 : 390 개 파일

가짜 지점없이 충돌 병합 : (220 개) 파일 가짜 분기와 충돌을 병합 대 : 68 개 파일

또한 전체 병합이 진행된 후에 가짜 분기없이 병합도 가능했는지 궁금해하기 시작했습니다.

읽어 주셔서 감사합니다.