2012-09-24 4 views
3

이전 버전의 SVN 저장소를 사용하여 체크 아웃 한 후 git-svn을 사용하여 Heroku에 푸시합니다. 나는 꽤 표준을하고 있었다 git push heroku master, git svn rebase, git svn dcommit 댄스와 물건은 멋졌다.일부 커밋에서 git-svn-id가 누락되었습니다.

그러나 최근에 나는 꽤 많은 양의 git 작업을 해오 고 잠시 동안 git svn rebase을 수행하지 않았습니다. 이제 리베이스를 시도 할 때 리포에 커밋하고 마스터에서만 작업하는 유일한 사람 임에도 불구하고 병합 충돌로 인해 실패합니다.

문제가 작업 복사본 일 수 있다는 것을 알아 낸 후 git svn clone을 새로 만든 다음 git remote add herokugit pull heroku master을 작성했습니다. 끌어 오기는 문제없이 빨리 감기 병합을 수행하지만 git svn rebase은 여전히 ​​실패합니다.

나는 간단한 git log을했고, 나는 옛날이 git-svn-id의 실종 커밋있는 것으로 확인 : 내가 누락 된 정보를 추가 할 수있는 커밋 메시지를 다시 할 수있을 것으로 수집 an SO answer에서

commit def8bab861314c67d4e8227e03775d19045d21d1 
Author: peterr 
Date: Fri Sep 21 16:17:33 2012 +0000 

    PHP Cedar support. 

    git-svn-id: http://vcp.unfuddle.com/svn/[email protected] b6b24ac3-8b7a-4c11-a811-49c5d0334e85 

commit f51bd78fb07dde6ec1dc4e0ba51a48f2b6bd1bd6 
Author: pr1001 
Date: Mon Aug 20 19:39:42 2012 +0200 

    Specify port correctly 

commit 153bb2929080898dcab46142120def0f4964dfab 

... 

commit 5a416fa3af9f64aa353d5171bedfaa563115ff62 
Author: pr1001 
Date: Mon Aug 20 17:22:58 2012 +0200 

    PHP Cedar support. 

commit e0b35588d03082a3a4ab49a7b590f206346046c0 
Author: j 
Date: Fri Aug 3 08:13:33 2012 +0000 

    change email 

    git-svn-id: http://vcp.unfuddle.com/svn/[email protected] b6b24ac3-8b7a-4c11-a811-49c5d0334e85 

을하지만, 그게 더 나쁘지 않을지 궁금해.

메시지를 보면 'PHP Cedar support'와 같은 일부 커밋이 중복 된 것처럼 보입니다. 나는 그들이 중복 된 것을 왜 의심하는지 모르지만 나는 정말로 당황 스럽다. git push heroku master 나는 다른 곳에서 저장소가 동기화되지 않았다는 말을 들었다. git pull heroku master은 절대적으로 변경 사항을 가져 오지 않고 문제를 해결 한 것으로 보이지만 중복 커밋을 가져온 것일 수 있습니다.

이 모든 질문을 감안할 때 간단히 말해서 어떻게 진행할 수 있습니까? 나는 Heroku에 대한 작업 응용 프로그램과 SVN 저장소에있는 오래된 작업 코드 기반을 가지고 있지만 SVN에 새로운 커밋을 깨끗하게 가져 오는 방법을 쉽게 알 수 없습니다. 나는 체리 선택해야합니까? 복제본을 다시 가져 오지 않으려면 Heroku 앱을 핵무기가 필요합니까?

답변

4

당신이이 상황에 어떻게 대처했는지 짐작하기는 어렵지 만, SVN git-svn을 (rebase 또는 reset을 사용하여) 대체 할 때 git-svn-id 시그니처로 커밋 할 때 2 가지 예가 있기 때문이라고 생각합니다 각각의 "local"- "git-svn-id"서명없이 --- 그리고 원격 서명.

은 복구하려면 : git co -b backup

  • 것은 최근에 심판/리모트/자식 - svn의 포인트와 커밋 있는지 확인하십시오

    1. 현재 상태 ( 백업의 일종)을 유지하기 위해 임시 지점 만들기 자식 - svn을-ID 자식 - svn을-ID 없이는 커밋을 서브 버전 저장소에 해당하지 않고있다가 이것이 사실이 아닌 경우, 당신은 수리 심판에 다음 트릭을 사용할 수 있습니다 git log refs/remotes/git-svn

    으로 표시됩니다/R 감정 표현/자식 - svn을 :

    $ git update-ref refs/remotes/git-svn e0b35588d03082a3a4ab49a7b590f206346046c0 
    

    설정 .git/SVN/메타 데이터 수정 : 모든 (상황에이 R23에 해당) 확인 어디 업데이트 심판이/리모컨이/자식 - svn을 최신으로 지점에 커밋

    [svn-remote "svn"] 
         reposRoot = ... 
         uuid = <UUID> 
         branches-maxRev = 23 
         tags-maxRev = 23 
    

    제거를 (또는 더 멀리 이동) 파일 .git/SVN/심판/리모트/자식-SVN/.rev_map을 : 그 개정을 가리 키도록.UUID 지금

    $ git svn fetch 
    

    당신의 심판/리모트는/자식 - svn을 참조 이제 최신 유효 SVN의 버전으로 복원 실행합니다.

    3.

    $ git fetch heroku master 
    

    을 병합하지 않고 Git 저장소에서 모든 변경 사항을 가져 오기 이제 모든 변화는 심판/리모트/Heroku가가/마스터에 있습니다.

    4. 지역 변경 사항이 없는지 확인하십시오 (현재 마스터 자격이 있음). refs/heads/master를 refs/remotes/git-svn으로 재설정하십시오. 그 중 한 가지 방법은 다음과 같습니다.

    $ git update-ref refs/heads/master refs/remotes/git-svn 
    $ git reset --hard HEAD 
    

    5. refs/remotes/heroku/master와 refs/remotes/git-svn을 살펴보십시오. refs/remotes/git-svn에없는 Git 저장소의 변경 사항이 있습니까? 그렇다면, 체리 - 하나씩 선택하십시오. 또한 백업 브랜치 (git-svn-id가없는 커밋에서만)를보고, 아직 SVN에 없으면 체리로 선택하십시오.

    6. 이제 SVN에없는 마스터에서 몇 가지 변경 사항이 있습니다.

    $ git svn dcommit 
    

    을 SVN으로 푸시하려면 다음을 실행하십시오.

    7. 이제 SVN 관련 브랜치가 완전히 복구되고 모든 변경 사항이 적용됩니다. 제대로 이해하면 Git 저장소에 동일한 콘텐츠가 필요합니다. refs/remotes/heroku/master를 현재 마스터 내용으로 대체하는 것이 더 낫습니다.

    이제 Git 저장소의 내용이 SVN 저장소와 동일합니다. 당신이 "자식 푸시"를 실행할 때

    것은 당신이 결코 푸시 힘내에 자식 - svn을-ID없이 저지른 있는지 확인 미래에 이러한 문제를 방지하기 위해 (마스터는 자식 - svn을-ID의 signatgures 만에 커밋 구성 즉 것을 그렇지 않으면 "git svn dcommit"을 실행하여 먼저 SVN에 푸시합니다.

  • +1

    완전히 다른 문제가 있었지만이 문제를 해결하기 위해 git-svn에 필요한 정보를 제공해주었습니다. 감사! :) –

    관련 문제