2013-05-13 4 views
0

몇 시간 전에 Subversion 저장소를 Git 및 github로 옮겼습니다. 일부 소프트웨어를 오픈 소스로 결정했을 때, 내가 한 일은 확실하지 않지만 커밋 이력은 이전되지 않았습니다. 당시 나는 신경 쓰지 않는다고 생각했지만, 지금은 Github에서 2 년 이상의 커밋을 좋아할 것이라고 생각한다. 문제는 내 프로젝트가 Github에 잠시 동안 있었으며 프로젝트가 생성 된 이후로 포크를 받고 커밋을 받았다는 것입니다.이전 SVN을 기존 Github 저장소로 커밋 하시겠습니까?

내 오래된 레포에서 역사적 커밋을 "되돌아와"가져갈 수있는 방법이 있습니까? Github 레포를 숨 쉬고 생기를 불어 넣으시겠습니까?

참고 : 나는 열심히 svn2git --rebase을 시도했지만, svn repo가 ​​남아 있기 때문에 커밋 된 것으로 간주 될지 확실하지 않습니다. 이 오류가 있고 난 무슨 뜻인지 잘 모르겠어요 : 자식에

command failed: 
2>&1 git svn fetch 

답변

2

조상보다 더 아무것도없는 parent <hash of parent commit>를 읽어 하나 개 이상의 행을 포함 (텍스트 파일 인) 커밋합니다. 첫 번째 커밋 전에 히스토리를 삽입하고 싶다면, 첫 번째 커밋의 해쉬가 바뀌어 부모를 바꿀 필요가 있음을 의미하는이 첫 번째 커밋의 해쉬가 변경됩니다 (첫 번째 커밋이없는 커밋 라인이 필요할 것입니다). 포인터를 가지고 있고 이것은 모든 커밋을 통해 재귀 적으로 진행됩니다. 모든 것은 repo의 첫 커밋의 자손입니다.

포크에서 작업하는 사람을 망칠 걱정이 없다면 (작업 내역이 프로젝트에서 변경 될 것이므로) 작업을 다시 실행하여 이전 기록의 두 번째 git repo를 만들고 해당 repo를 추가 할 수 있습니다 새 Repo의 원격 위치로 이동하고 변경 사항을 가져 오면 이제 새 저장소에 두 개의 뿌리가 생깁니다. 공통점이 없다는 경고 메시지가 나타날 수 있습니다. 이건 괜찮아. 이제 베어링을 얻기 위해 내역을 볼 수 있습니다 : git log --all --graph --oneline --decorate, 그리고 아마 rebase --onto을 실행하여 방금 가져온 이전 repo의 기록 위에 새 repo의 새로운 작업을 이동하십시오. 아마도 새 repo의 첫 번째 커밋에있는 트리가 트리가 이전 repo의 마지막에 있기 때문에 다음과 같이 간단 할 수 있습니다. git rebase --onto A B C, 여기서 A은 방금 가져온 이전 repo의 기록에서 마지막 커밋입니다. B은 새 repo에서 첫 번째 커밋입니다 새로운 저장소의 "old base"는 이전 기록에 리베이스하지 않으며 동일해야하므로 C은이 저장소에 리베이스하려는 새 저장소의 지점 머리입니다 master

리포지토리가 더 복잡 할 수 있습니다. 한, 그리고 당신은 물건을 다시 합류하기위한 이음새의 정확한 위치를 알아 내기 위해 더 많은 작업을해야 할 수도 있습니다. 그러나 그것은 일반적인 생각입니다. 이제 git remote rm newrepo을 추가 할 수 있습니다. "newrepo"는 리모컨을 추가 할 때 원격 이름을 지정합니다. 두 번째 루트와 모든 반입 된 커밋을 지워야합니다. 마지막으로 강제로 이것을 github로 푸시 할 수 있습니다. 이것은 문자 그대로 모든 커밋 해시로 바뀌므로 아무 포크도 작동하지 않지만 모든 기록이 있고 사람들은 다시 복제 할 수 있습니다. 또는 reset --hard을 새로 고치기 위해 master으로 다시 잡을 수 있습니다. 아마도 repo 페이지에서이 사실을 모든 사람들에게 알리고, 의도를 포크하고 경고하는 사람들을 찾을 수 있습니다.

관련 문제