2013-03-02 1 views
2

VC에 처음 들어가면 SVN을 사용하면서 내가하는 일을 이해하지 못했습니다. 나는 하나의 프로젝트를 서로 다른 트렁크에 유지했지만 동시에 모든 트렁크에 커밋을하여 동일한 커밋 메시지를 가진 여러 커밋을 발생 시켰습니다. 약 2 년 전에 나는 모든 트렁크를 깨뜨 렸고 하나의 트렁크에 그 다음 더 많은 것을 깨우고 repo를 git으로 바꾸었다. 이제는 소수의 지점으로 빠르고 유연한 레포를 가지고 있으며 더 행복 할 수 없었습니다 ...중복 커밋 메시지를 제거하기위한 히스토리 다시 쓰기

... 오래된 커밋 메시지가 모두 나를 괴롭 히고 있습니다. (그들은 내 레포에서 커밋의 약 1/3-1/2를 차지합니다.) 이것은 바로 git rebase이 맞습니까? 한 복제본에 대해 실행 한 테스트를 시도했지만 내 분기의 나머지 부분에서 내 master 분기를 분리 한 것처럼 보였다. 나는 git rebase -i <sha>으로 그 일을했고, 커밋 된 모든 커밋을 처음으로 압축했다. 내 지사 구조는 그대로 유지하고 싶습니다.

스쿼시를 보내려는 모든 중복 메시지는 svn=>git 변환을 수행하기 전에 발생했으며 모든 분기가 해당 변환 후에 시작되었습니다. 다시 말하면, svn=>git 변환 전의 전체 역사는 가지가없는 선형입니다.

또 다른주의 사항 -이 repo가 ​​원격 저장소에 푸시되었습니다. 공유 리포지토리의 다시 쓰기 기록은 나쁜 소식이지만, 아무도 아직 내 원격에서 복제하거나 포크를 작성하지 않아서 만 고려할 것입니다. 내가 복제/포크 (fororking/forking)하기 전에 역사를 정리하고 싶습니다.

그래서 한 점까지 기록을 다시 쓰고 나머지는 그대로 둡니다. 이 엉망을 청소하는 데 도움이되는 다른 제안이 있습니까?

답변

3

rebase를 사용하면 두 개의 이전 커밋을 하나의 명령으로 스쿼시 할 수 있지만 은 완전히 새로운 커밋이됩니다. 따라서 rebase는 새로운 커밋을 가리 키도록 모든 자식을 변경해야합니다 (커밋 바로 다음에 커밋). 그러면 다시 완전히 커밋됩니다. - 등등 ...

이전 커밋을 수정/리베이스하면 완전히 새로운 커밋 그래프가됩니다. 다른 분기는 여전히 이전 그래프를 가리 킵니다. 그래서 당신은 당신의 지점을 모든 다른 지점들과 분리했습니다.

커밋 분기의 복잡성에 따라 정리가 매우 까다로워집니다. 아마도 대부분의 경우 저장소를 그대로 두어야합니다.

정말로 기록을 변경하고 싶다면. SVN 커밋을 가리키는 새 분기를 만들어야합니다.이 커밋은 모든 분기의 부모가되어야합니다. git tag oldsvn $SHA1; git checkout -b newsvn oldsvn

이제 해당 분기를 정리 한 후 해당 분기의 다른 분기를 모두 리베이스 할 수 있습니다. (그것은 리베이스의 실제 아이디어로 지사에게 새로운 기반을 제공합니다.) git rebase --onto newsvn oldsvn $branch으로 할 수 있습니다.

공통 기록을 공유하는 여러 가지를 다시 작성하면 지점마다 다른 트리가 다시 생성 될 수 있습니다. 보십시오 Git: How to rebase many branches (with the same base commit) at once?

+0

Ewww. 혼자서 떠나는 것이 여기 갈 길인 것 같습니다. 감사. – Clayton

관련 문제