본문 바로가기
GIT

Git 저장소 옮기기 / 복사 : git repository mirroring

by 양찬우 2021. 6. 3.
728x90

깃 미러링: Git repository mirroring  

  • Git 원격 저장소를 다른 Git 원격 저장소로 커밋 로그를 포함해 온전히 옮길 때 사용한다.
    • Github, Gitlab, Bit bucket 등 Git 기반 원격 저장소 간 모두 가능하다. 

(*편의상 원본 저장소를 A, 복사 저장소를 B로 지칭한다.)

1. 원본 저장소(A)의 데이터를 mirror 옵션을 사용해 로컬로 Clone


$ git clone --mirror [원본 저장소(A) 주소]

// git mirroring, 원본 저장소(A)의 데이터를 클론한다.

2. Clone 한 로컬 저장소에서 mirror 옵션을 사용해 복사할 원격 저장소(B)로 Push


$ git remote set-url --push origin [이동할 원격 저장소(B) 주소]
$ git push --mirror

// 클론한 로컬 저장소(A) 디렉토리에서 실행한다.

 

 

Error: Large file issue, Git 파일 크기 제한 에러가 발생했을 경우  

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: e3688f9d27edc7d94098eca76412391d
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File static/images.zip is 436.46 MB; this exceeds GitHub's file size limit of 100.00 MB
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://oizys18@github.com/sth/sthsth.git'
  • github의 파일 사이즈 제한은 100mb다. 100mb보다 더 큰 파일을 push 하려고 하면 해당 에러가 발생할 수 있다.
  • 이 에러는 HEAD (최신)에 해당 파일이 없더라도 commit 이력에 존재하면 발생할 수 있다. 
  • 과거 머신러닝 시 사용했던 샘플데이터들을 별 생각없이 push 하고 clone 하다가 자주 본 메시지들이다. 

 

A) 파일이 더 이상 필요없을 경우, 해당 커밋 이력을 삭제하고 push 한다. 

 

1. git-filter-branch를 사용해 파일을 삭제한다.

$ git filter-branch -f --index-filter "git rm --cached --ignore-unmatch static/sample-data.zip" -- --all

2. 기존 commit id를 삭제한다. 

$ rm -rf .git/refs/original/

3. commit id를 재설정, 저장소를 garbage colletcor로 청소한다.  

$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive

4. 용량이 낮아진 저장소를 push 한다.

 

혹은, BFG Repo-Cleaner를 사용한다. 

1. BFG Repo-Cleaner에서 bfq-x.x.x.jar 파일을 로컬 저장소 위치에다운 받는다.

 

BFG Repo-Cleaner by rtyley

$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re

rtyley.github.io

2. java 명령어를 통해 100mb보다 큰 파일을 정리한다. 

$ java -jar bfg-x.x.x.jar --strip-blobs-bigger-than 100M
(...)
Deleted files
    — — — — — — -
    Filename Git id
    — — — — — — — — — — — — — — 
    sample-data.zip | b442f23b (120.9 MB)
(...)

3. 용량이 낮아진 저장소를 push 한다.

 

B) Git LFS 

에러 메시지에서 안내되었듯이, 해당 기능을 사용하면 용량이 큰 커밋을 작게 조각내어 문제없이 push 할 수 있다. 

1. Git Large File Storage를 로컬에 설치

 

Git Large File Storage

Git Large File Storage (LFS) replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents on a remote server like GitHub.com or GitHub Enterprise.

git-lfs.github.com

$ git lfs install

2. git-lfs가 용량이 큰 자료를 track 하도록 설정 후 commit 

$ git lfs track “sample-data.zip”
Tracking *sample-data.zip

$ git commit -m “Commit Large data file”
[master (root-commit) be2b425] Commit Large data file
(...)

ETC

  • git push --mirror로컬 브랜치 + 원격 브랜치까지 push 한다. 따라서 처음 clone 후 한 번만 사용하고, 이후부터는 일반 push만 하는 것이 권장된다. 

참고자료

 

How to mirror a git repo with large files in its commit history

For when Github's 100MB file size restriction bumps up against previously-committed files

blog.millerti.me

 

Git - git-clone Documentation

In general, URLs contain information about the transport protocol, the address of the remote server, and the path to the repository. Depending on the transport protocol, some of this information may be absent. Git supports ssh, git, http, and https protoco

git-scm.com

 

Is "git push --mirror" sufficient for backing up my repository?

I'm a solo developer, working in a local Git repository. For backups, I want to send an exact copy of that repository off to another server. Is it sufficient to do this? git push --mirror I'm as...

stackoverflow.com

 

 

Transferring a repository - GitHub Docs

About repository transfers When you transfer a repository to a new owner, they can immediately administer the repository's contents, issues, pull requests, releases, project boards, and settings. Prerequisites for repository transfers: When you transfer a

docs.github.com

 

728x90

댓글