2009-07-10 8 views
3

내 전체 repo (표준 git svn init -t tags -b branches -T trunk $repo_url 패션으로 초기화 된 다음 git svn fetch에 초기화 됨)의 git-svn 체크 아웃이 있습니다. 나는 수동으로 svn copy $repo_url/branches/branch1 $repo_url/branches/branch2. git svn fetch, git checkout -b local-branch2 branch2을 실행하여 branch2, dcommit에 다시 작성하고 branch2에 대한 작업을 완료했습니다. (브랜치를 브랜치하는 이유는?이 브랜치를 git에서 해킹하고 싶었지만 여전히 SVN에 커밋하고 몇 명의 동료로부터 도움을 받는다.)git-svn : 하나의 SVN 브랜치에서 다른 CVN 브랜치로 git 커밋을 복사하는 방법은 무엇입니까?

branch2을 병합하여 수행 한 작업이 branch1으로 되돌아갑니다. 내가 git checkout -b local-branch1 branch1이면 git merge branch2이면 local-branch1 포인터를 빨리 감기 (branch2)합니다.

대신, 나는 을 branch1에 시작한 이후 만들어진 모든 커밋을 재생하여 각 SVN Repo에 dcommit 할 수 있기를 바랍니다. 이렇게하는 방법이있는 것 같지만 생각할 수 없습니다. 어쩌면 git rebase 또는 각 커밋의 git cherry-pickbranch2일까요? (비록 후자가 약간 지루하다). 차라리 두 개의 URL을 함께 svn 병합하지 않는 것이 좋습니다. 큰 상처입니다.

아이디어가 있으십니까? 이것의 어떤 부분이 더 설명을 필요로합니까?

+0

* "왜 지점을 분기합니까?"* git. 예. – naught101

답변

6

local-branch1에없는 branch2에 대한 첫 번째 커밋은 아마도 branch2를 만든 커밋 일 것입니다, 그렇습니까? 이것은 git에서 빈 커밋으로 표시되어야합니다 (예 : 메시지이지만 내용 없음). sha1 식별자를 복사하십시오. 그런 다음 local-branch1에서 git reset --hard branch2 && git rebase --onto [email protected]{1} SHA1 (여기서 SHA1은 복사 된 sha1 임)을 시도하십시오. 빈칸을 제외한 모든 커밋을 브랜치 1에 다시 재생해야합니다. 대화 형 리베이스를 만들고 각 커밋을 편집하여 git-svn이 추가하는 git-svn-id : 행을 제거 할 수 있습니다. (또는 커밋이 충분하다면 git-filter-branch 스크립트를 사용하여 그렇게 할 수 있습니다).

호기심에서 왜 각 커밋을 재생하겠습니까? 변경 사항을 간단히 병합하려면 훨씬 간단합니다. 바로 git checkout local-branch1 && git merge --squash branch2 && git commit을 사용할 수 있습니다. 이것은 빨리 감기가 아닌 병합을 할 것이지만 실제로 병합 커밋을하지는 않을 것입니다 (git-svn을 혼란스럽게 만듭니다). 대신 병합이 발생했으나 하나의 부모 만 가진 것처럼 동일한 작업 트리를 생성합니다. 이것은 svn 병합 작업을 반영합니다.

+0

모든 것이 효과가있는 것 같습니다. 감사합니다. 스쿼시 커밋을 원하지 않았습니다. 이후에 아무 것도 회피해야 할 경우에 대비해 repo (diffs 및 commit 메시지)의 각 커밋을 유지하려고했기 때문입니다. 다음에이 방법을 다시 생각해 볼 수는 있습니다 만, 조금 더러워지기 때문입니다. – cbowns

+0

또한, 친구가 내게 해주었습니다. git-svn은 커밋 메시지의 기존 git-svn-id 행을 무시하는 것이 더 좋으며 잘못된 분기로 커밋되지 않습니다. – cbowns

+0

더 많은 커밋을 한 후,'git svn info'는 잘못된 커밋을 다시 한 번 보여주었습니다 (branch2에서 저를 데려갔습니다). 나는 체리를 골라 내 길을 branch1로 되돌려 놓은 다음'git checkout master; git reset --hard branch1'를 사용하여 원하는 곳으로 마스터를 되돌려 놓습니다. – cbowns

관련 문제