GibLab 저장소 미러링 GitHub

RUNGOAT·2023년 4월 29일
2

Git

목록 보기
2/3

미러링을 진행하게 되면 단순히 파일만 복사하는 것이 아닌 GitLab에서 작업했던 commit log를 그대로 GitHub로 옮길 수 있다.


1️⃣   저장소 미러링하기

1. 복사하고자 하는 저장소(gitlab)의 bare clone을 생성

 git clone --bare https://gitlab.com/exampleuser/old-repository.git

2. 새로운 저장소(github)로 mirror-push를 진행

 cd old-repository.git
 git push --mirror https://github.com/exampleuser/new-repository.git

대부분의 경우 위 방법으로 mirror-clone이 가능하다. 하지만 GitHub 정책상 100MB를 넘어가는 파일이 한 번이라도 커밋된 경우가 있으면 오류가 발생하여 PUSH가 불가능하다.


2️⃣   100MB가 넘는 파일 삭제하고 저장소 미러링하기

1. BFG Repo Cleaner를 설치

2. 복사하고자 하는 저장소(gitlab)의 bare clone을 생성

 git clone --mirror <gitlab_repository_url>

3. 100MB보다 큰 모든 Blob을 제거

$ 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.jar
java -jar <bfg-1.14.0.jar 파일 경로> --no-blob-protection --strip-blobs-bigger-than 100M <gitlab_repository_name>.git'

4. Repository 정리

$ cd <gitlab_repository_name>.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

repository를 검사하여 기록이 업데이트되었는지 확인한 다음 표준 git gc명령을 사용하여 원하지 않는 dirty 데이터를 제거합니다.

5. GitHub push

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 정보는 전송되지 않습니다.


3️⃣   100MB 넘는 파일 Git LFS 사용하여 저장소 미러링하기

  • 위의 방법은 파일을 제거하는 것이다.
    만약 파일이 필요하다면 Git LFS도 사용해보자

    LFS란?
    LFS는 Git Large File Storage의 약자로,
    깃에서 큰!! 파일을 업로드하거나 다운로드할 때 사용하는 오픈소스 Git Extension이다.
    출처: LFS (Git Large File Storage)

1. Git LFSBFG Repo Cleaner 설치

2. 복사하고자 하는 저장소(gitlab)의 bare clone을 생성

 git clone --mirror <gitlab_repository_url>

3. 커밋 히스토리 내에서 large file을 찾아 트랙킹

 git filter-branch --tree-filter 'git lfs track "*.{zip,jar}"' -- --all

4. BFG를 이용하여 해당 파일들을 Git LFS로 변경

 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.jar
java -jar <bfg-1.14.0.jar 파일 경로> --no-blob-protection --convert-to-git-lfs '*.jar'

5. GitHub push

cd <gitlab_repository_name>.git
git remote add github <github_repository_url>

git push --all github
git push --tags github

📌 참고

profile
📞피드백 너무나 환영

0개의 댓글