2014-09-09 2 views
0

우리 repo는 SVN에서 이식되었습니다. 때문에 SVN에 대한 몇 가지 표준이 아닌 동작, git-svn 모든 변경은 "파일 추가"를 의미하는, C0과 C1은 '모든 "초기 커밋"있는 ​​다음힘내는 두 개의 다른 스레드를 연결합니다

C0 <- C1 <- C2 ... 
     C1' <- C2' ... 

같은 다른 스레드를 생성합니다. 이제 내가 무엇을 ''는 동일한 루트를

다음
C0 <- C1 <- C2 ... 
    |<- C1'' <- C2' ... 
C1' 

C1을 공유 할 수 있도록 C0에 '하면된다 C1에 가입하기 위하여려고하는 것은 그 커밋이다

가,'C0과 C1의 병합하지만 최종 상태는 C1 '과 동일합니다. 그러면 나중에 체인 노드가 변경되지 않은 상태로 유지 될 수 있습니다.

git 명령을 조합해서 사용할 수 있습니까? 문제가 커밋이 부모 ID (들)을 포함한 모든 내용의 체크섬, 는 것을, 그래서 당신은 C1'를 가리키는 C2'을 가지고 있다면 당신은합니다

답변

2

자식에 대한 도움말 페이지를 교체하고 힘내 버전보다 오래된 2.1 사용

를 들어 --graft C1 'C0

교체 다음 명령을

자식을 시도하십시오

NEW_SHA=$(echo "Replacement commit" | git commit-tree -p CO C1'^{tree} -F -) 
git replace C1' $NEW_SHA 
+0

아, 그래, 트릭을 대체하는 것이 좋습니다. – torek

+0

좀 더 설명해 주시겠습니까? 이게 어떻게 작동합니까? –

+1

하나의 오브젝트를 다른 오브젝트로 대체 할 수있는 git의 모호한 기능을 사용합니다. 이 경우에는 트리가 같지만 부모가 다른 새 개체를 만든 다음 이전 커밋을 바꿉니다. 교체 용 도움말 페이지가 자세히 설명되어 있습니다. –

1

문자 적 ​​대답은 '노 새 복사본 C1''을 사용하려면 C2''이라는 새 복사본을 C1'' 등으로 가리켜 야합니다.

일을 할 수있는 명백한 명령 git filter-branch이다, 말했다 : 당신이 부모로 C0을 가지고 커밋 새에 C1'을 복사 할 필터를 저지를 사용하고 커밋의 전체 나머지를 통해 그 변화 리플을하도록 할 수 있습니다 -그래프. 그러나 그렇게하려는 경우 가져 오기를 다시 수행하는 것이 더 바람직 할 수 있습니다. (저는 SVN 수입품에 전문가가 아닙니다. 전에 CVS-to-git 수입품을 몇 번 해봤는데, 몇 가지 시험 수입품을 가져다가 더 나은 옵션 등으로 그들을 재화했습니다. 아주 느리지 만, 그게 전부였습니다. 컴퓨터 시간, 내가 다른 일을했다 동안.)

+0

예, svn 가져 오기 시도가 많이 있었고 위의 내용은 내가 가장 잘 믿었던 것입니다. ... –

관련 문제