GitLab에 있는 레포지토리를 GitHub Enterprise(GHE)로 이관하는 방법을 정리한 문서입니다.
본인은 일반 clone 방식을 사용하며, 대용량 파일이 포함된 경우의 처리 방법(Git LFS)도 함께 다룹니다.
방법 1: 전체 이관 (모든 브랜치/태그) - Mirror 방식
모든 refs(브랜치, 태그, notes 등)를 통째로 옮기는 방법입니다.
# 1. GitLab 레포를 mirror 모드로 bare clone
# - 모든 refs(브랜치, 태그, notes 등)를 그대로 가져옵니다
git clone --mirror https://gitlab.com//.git
cd .git
# 2. GHE에 빈 레포 생성 후, 해당 URL로 mirror push
# - --mirror는 모든 refs를 그대로 복제 푸시합니다 (강제 갱신 포함)
git push --mirror https://github.com//.git
특징
- ✅ 모든 브랜치, 태그, refs를 한 번에 이관
- ⚠️ GHE 쪽 기존 내용을 덮어쓸 수 있음 (빈 레포에서만 사용 권장)
- ⚠️ bare clone이라 작업 디렉토리 없음
방법 2: 특정 브랜치만 이관 - 일반 Clone 방식
원하는 브랜치만 골라서 안전하게 옮기는 방법입니다.
# 1. 일반 clone (mirror 아님)
git clone https://gitlab.com//.git
cd
# 2. 옮기고 싶은 브랜치로 체크아웃
git checkout
# 3. GHE를 새 remote로 등록
git remote add ghe https://github.com//.git
# 4. 해당 브랜치만 푸시 (빈 레포면 -f 불필요)
git push ghe
특징
- ✅ 옮길 브랜치만 선별 가능
- ✅ GHE에 기존 내용이 있어도 안전 (force 아님)
- ✅ 잔여 브랜치 정리하면서 이관 가능
- 여러 브랜치 옮기려면 2번과 4번 단계 반복
🚨 대용량 파일로 인한 푸시 실패 해결
문제 상황
GHE의 파일 크기 제한(100MB)을 초과하는 파일이 히스토리에 포함되어 있으면 푸시가 거부됩니다.
remote: error: File ... is 405.06 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB
remote: error: GH001: Large files detected.
! [remote rejected] develop -> develop (pre-receive hook declined)
핵심 개념
- GitLab UI에서 파일이 안 보이더라도 과거 커밋 히스토리에는 남아있을 수 있음
- Git은 푸시 시 현재 파일이 아닌 전체 히스토리를 전송
- GitLab은 파일 크기 제한이 관대하지만, GHE는 엄격함 (100MB)
히스토리에서 대용량 파일 확인하는 방법
# 특정 파일이 히스토리에 있는지 검색
git log --all --full-history -- "파일경로/파일명"
# 히스토리의 대용량 파일 TOP 20 확인
git rev-list --objects --all | \\
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \\
awk '/^blob/ {print $3, $4}' | \\
sort -rn | \\
head -20
💾 Git LFS로 대용량 파일 처리하기
대용량 파일이 계속 필요한 경우 Git LFS를 사용합니다.
1. Git LFS 설치
brew install git-lfs
git lfs install
git lfs version # 설치 확인
2. 기존 히스토리의 대용량 파일을 LFS로 마이그레이션
git lfs migrate import \\
--include="*.csv,*.parquet,*.npy,*.pt,*.index" \\
--everything
💡 --everything 옵션은 모든 브랜치와 태그를 함께 처리합니다.
⚠️ 이 작업은 커밋 히스토리를 다시 쓰기 때문에 commit hash가 변경됩니다.
3. 마이그레이션 결과 확인
git lfs ls-files
LFS로 추적되는 파일 목록이 출력됩니다.
4. 강제 푸시
이전에 푸시 시도가 있었다면 force push가 필요합니다.
git push ghe develop --force
성공 시 출력 예시:
Uploading LFS objects: 100% (375/375), 3.1 GB | 29 MB/s, done.
* [new branch] develop -> develop
5. 태그도 함께 푸시 (선택사항)
git push ghe --tags --force
'Data Engineering' 카테고리의 다른 글
| [Airflow] Google 앱 비밀번호 설정 (0) | 2025.12.03 |
|---|