본문 바로가기
programming

GitLab에서 GitHub 미러링 시 저장소가 너무 커서 불가능한 경우

by s2econd.blue 2022. 11. 24.

제가 하려던 작업은 

1. 미러링으로 GItHub에 저장소 복사
2. GitHub 아이디로 제가 올린 커밋 기록을 변경

하지만 제 경우, 미러링이 되지 않을 뿐만 아니라  저장소의 용량이 기가 바이트 단위를 넘겨 git pull 자체가 되지 않는 상황이었습니다..

이 문제를 해결하기 위해

1. 우선 분할해서 pull을 받고
2. 커밋 기록을 수정한 뒤
3. 문제가 되는 파일을 삭제
4. 미리 만들어 둔 저장소와 remote 저장소를 변경해 연결하고 미러링 옵션으로 GitHub에 올리는 것입니다. 

순서가 매우 중요하니 저와 비슷한 상황에 처하신 분들은 자신에게 필요한 과정은 채택하되, 순서는 그대로 유지하는 것이 좋을 것 같습니다.


1. 대용량 저장소를 분할해서 받아오기

depth 옵션을 통해 저장소를 분할해서 받아주면 됩니다.

git clone --depth=10 https://[저장소 https clone 주소].git

depth의 크기는 1 이상이면 되며 그 크기만큼 로그를 가져옵니다.

전 10을 했더니 받아오는 게 가능해서 이 값을 주었습니다.

다음은 depth 크기를 키워주며 조금씩 받아오는 것입니다.

git fetch --depth 40

git fetch --depth 70


경험상, git은 한 번에 받아오는 크기가 1GB 정도가 되면 에러가 발생하며 취소되기 때문에 받아오는 용량이 1GB보다 작을 정도로만 계속 fetch해줍니다.


2. 커밋 기록 수정

GitLab의 이메일 주소와 GitHub의 이메일 주소가 달라 그대로 미러링을 했을 시 제 GitHub의 잔디는 채워지지 않습니다.

git filter-branch --env-filter '
WRONG_EMAIL="변경전 이메일"
NEW_NAME="새로운 이름"
NEW_EMAIL="새로운 이메일"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

git의 필터 체인으로 모든 커밋을 순회하며 위의 변경전 이메일에 해당하는 commiter를 변경하려는 이메일과 이름의 author로 변경하는 명령어입니다.

만약 아래의 문제가 되는 파일을 먼저 툴로 삭제한다면 무언가 변경이 되는 것인지 제 커밋 기록 수정 명령어가 듣지 않았습니다.


3. 문제가 되는 파일 삭제

문제가 되는 대용량 파일에 대한 대처법은 다양합니다.

1. BFG 란 툴을 활용해 일정 용량 이상의 파일을 모든 커밋 기록에서 삭제하는 방식
2. 필터 체인을 활용해 특정 폴더/파일을 삭제하는 명령어 실행하는 방식
3. 대용량 파일을 잘게 쪼개서 푸시가 가능하도록 하는 방식
4. 대용량 파일을 git 외부에 올리고 git에서는 그 주소만 받아서 사용하는 방식

전 깔끔하게 특정 작업물을 삭제하고 싶었기 때문에 2번 명령어로 진행했습니다.

git filter-branch --tree-filter 'rm -rf Unity/' HEAD

 

 

depth 명령어로 저장소를 단계적으로 받아오는 것과는 다르게 모든 커밋 기록에서 삭제를 하다보니 상당히 오랜 시간이 소요되었습니다. 

30분이 다 되어가는 상황


4. GitHub에 미러링된 저장소로 올리기

repo 주소를 올리고자 하는 저장소로 변경한 뒤 강제로 푸시를 하면 변경된 이메일 이름이 커밋에 적용된다.

이 방법으로 올리면 됩니다.

댓글