미러링을 진행하게 되면 단순히 파일만 복사하는 것이 아닌 GitLab에서 작업했던 commit log를 그대로 GitHub로 옮길 수 있다.
git clone --bare https://gitlab.com/exampleuser/old-repository.git
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
대부분의 경우 위 방법으로 mirror-clone이 가능하다. 하지만 GitHub 정책상 100MB를 넘어가는 파일이 한 번이라도 커밋된 경우가 있으면 오류가 발생하여 PUSH가 불가능하다.
git clone --mirror <gitlab_repository_url>
$ java -jar <bfg-1.14.0.jar 파일 경로> --strip-blobs-bigger-than 100M <gitlab_repository_name>.git
BFG는 커밋과 모든 브랜치 및 태그를 업데이트하여 정리하지만 원하지 않는 항목을 물리적으로 삭제하지는 않습니다.
--no-blob-protection
옵션을 사용하면 브랜치의 최신 커밋들에서 발견되는 파일도 처리합니다.- 기본적으로 BFG Repo-Cleaner는 브랜치의 최신 커밋에서 찾은 파일들을 보호합니다.
- <bfg-1.14.0.jar 파일 경로>는 \가 아닌 /을 사용해야 합니다.
예시) C:/Users/Downloads/bfg-1.14.0.jarjava -jar <bfg-1.14.0.jar 파일 경로> --no-blob-protection --strip-blobs-bigger-than 100M <gitlab_repository_name>.git'
$ cd <gitlab_repository_name>.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
repository를 검사하여 기록이 업데이트되었는지 확인한 다음 표준 git gc명령을 사용하여 원하지 않는 dirty 데이터를 제거합니다.
cd <gitlab_repository_name>.git
git remote add github <github_repository_url>
git push --all github
git push --tags github
! [remote rejected] refs/merge-requests/57/merge -> refs/merge-requests/57/merge (deny updating a hidden ref)
이 오류는 GitHub에
push --mirror
할 때 GitLab의 merge request 정보를 GitHub로 전송하려고 시도하기 때문에 발생합니다. GitHub은 GitLab의 merge request와 호환되지 않으며, 이러한 hidden ref를 업데이트하려는 시도를 거부합니다.
이 문제를 해결하기 위해서는
git push --mirror github
대신--all
및--tags
옵션을 사용하여 모든 브랜치와 태그를 푸시해야 합니다.cd <gitlab_repository_name>.git git remote add github <github_repository_url> git push --all github git push --tags github
이 방법을 사용하면 브랜치와 태그 정보를 전송할 수 있지만 GitLab의 merge request 정보는 전송되지 않습니다.
LFS란?
LFS는 Git Large File Storage의 약자로,
깃에서 큰!! 파일을 업로드하거나 다운로드할 때 사용하는 오픈소스 Git Extension이다.
출처: LFS (Git Large File Storage)
git clone --mirror <gitlab_repository_url>
git filter-branch --tree-filter 'git lfs track "*.{zip,jar}"' -- --all
java -jar <bfg-1.14.0.jar 파일 경로> --convert-to-git-lfs '*.zip'
java -jar <bfg-1.14.0.jar 파일 경로> --convert-to-git-lfs '*.jar'
- 여기서도
--no-blob-protection
옵션을 사용하면 브랜치의 최신 커밋들에서 발견되는 파일들을 처리합니다.- <bfg-1.14.0.jar 파일 경로>는 \가 아닌 /을 사용해야 합니다.
예시) C:/Users/Downloads/bfg-1.14.0.jarjava -jar <bfg-1.14.0.jar 파일 경로> --no-blob-protection --convert-to-git-lfs '*.jar'
cd <gitlab_repository_name>.git
git remote add github <github_repository_url>
git push --all github
git push --tags github