프로젝트를 깃랩에서 진행하여 깃헙 잔디가 많이 죽어있었습니다...
잔디를 되살리기 위해서 깃랩에 있는 커밋 기록을 깃헙으로 옮기는 방법을 알아봤습니다.

깃랩에서 깃헙으로 레포지토리 이동하기

$ git clone --bare {깃랩주소}

git bash에서 해당 명령어로 옮기려는 커밋 기록이 있는 깃랩 주소를 불러옵니다.

$ cd {레포지토리명}.git
$ git push --mirror {깃헙주소}

로컬로 불러온 레포지토리에 들어가서 옮기고 싶은 깃헙에 push합니다.

이렇게 하면 웬만한 레포지토리는 이동이 가능합니다.

다만, 제가 진행했던 프로젝트 중에 data.json파일의 크기가 깃헙 용량 제한인 100MB를 넘어가는 경우가 있어 이 방법으로 옮겨지지 않았던 경우가 있었습니다.

일단 파일을 삭제하고 이동을 시도했지만 당연히 안되었습니다. 검색 해보니 커밋 기록에 이 파일이 포함되어 있으면 불가능하다는 사실을 알게 되었고, 어떻게든 이동시켜보려 lfs나 BFG repo cleaner 등 다양한 방법을 시도해봤지만 레포지토리 이동에 실패하였습니다.

그래서 저는 data.json과 관련된 커밋기록만을 삭제하여 새로운 브랜치를 만들어 그것을 옮기는 방법을 선택했습니다.

 

Git Rebase 관련 글

 

Git - Rebase 하기

Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. 새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커

git-scm.com

 

커밋 기록 삭제하기 (rebase)

 처음 해보는 rebase라 혹시나 다른 코드를 건드릴까봐 develop 브랜치 (혹은 main, master)에서 rebase라는 브랜치를 만들어서 이곳에서 작업을 진행했습니다.

$ git clone {깃랩주소}
$ git switch -C rebase

 

 이 후에 삭제할 커밋 기록을 찾았습니다.

 제 경우에는 id가 d63fd37인 커밋 기록을 지워야 했습니다. 이 전 커밋의 id를 이용하여 해당 위치를 불러왔습니다.

git rebase -i 1d47b1f4b7679d5dfd7eb0f839aad8a83ea8f9a2

 

 그럼 제거하려는 커밋이 가장 위쪽에 올라오고 rebase작업에 대해 선택할 수 있습니다.

저는 이 커밋을 삭제하여야 하니 pick을 drop으로 바꾸어 줍니다.

 이 후 :wq로 저장 후 닫아줍니다.

 

 제 경우에는 이 커밋이 프로젝트 초기에 생겼고, 중간에 위치도 바뀌고 삭제도 되며 이것과 충돌을 일으키는 커밋이 상당히 많이 있었습니다. 그래서 다음과 같이 conflict를 일으켰습니다.

 이렇게 된다면 reabase가 충돌을 일으킬 때마다 로컬에서 변경사항을 확인해가며 올바른 방향으로 commit을 남겨주면 됩니다. 저는 따로 변경할 부분은 없고 남아있는 커밋들을 살려나갔습니다.

 (뭔가 다른 방법이 있을 것 같은데 전 이 방법밖에 몰라서 일단 옮기고 보자해서 반복 노동했습니다...)

$ git add .
$ git rebase --continue

 525개의 커밋이 모두 정상적으로 올라갈 때까지 이 작업을 반복했고 rebase를 마쳤습니다.

 

 혼자 한 프로젝트라면 rebase만 남기고 브랜치를 정리한 뒤 기존 방식대로 깃랩에서 깃헙으로 옮겼을텐데, 나머지 브랜치를 정리했다가 팀원들에게 무슨 소리를 들을 지 몰라 100MB 기준에 걸리지 않는 rebase 브랜치만 따로 옮기는 방법을 찾아보았습니다.

 

$ git clone --bare -b {브랜치명} --single-branch {깃랩주소}
$ cd {레포지토리명}.git
$ git push --mirror {깃헙주소}

 이 명령어로 rebase 브랜치만 clone하여 성공적으로 깃헙에 옮길 수 있었습니다.

+ Recent posts