외부 저장소와 내부 저장소를 함께 두고 같은 내용을 유지해야 하는 경우가 있다. 폐쇄망이라 외부에 직접 붙지 못하거나, 외부 장애에 대비해 내부에 사본을 두는 경우다. 방법은 셋이고 성격이 다르다.
기존 저장소를 통째로 새 호스트로 옮긴다.
git clone --mirror https://github.com/company/project.git
cd project.git
git remote set-url --push origin https://forgejo.internal/company/project.git
git push --mirror
--mirror 로 클론하면 작업 트리 없는 베어 저장소가 되고 모든 참조(refs/*)를 그대로 가져온다. git push --mirror 는 그 참조를 대상에 그대로 반영한다.
--mirror 푸시는 대상에만 있는 브랜치와 태그를 지운다. 비어 있는 새 저장소로 옮길 때만 쓴다. 이미 내용이 있는 저장소에 쏘면 그쪽 이력이 사라진다.
주기적으로 갱신하려면 다음을 반복한다.
git -C /srv/mirror/project.git remote update --prune
git -C /srv/mirror/project.git push --mirror
Forgejo · Gitea · GitLab 은 저장소 설정에 미러 기능이 있다.
| 방향 | 이름 | 동작 |
|---|---|---|
| 외부 → 내부 | Pull mirror | 내부 저장소가 주기적으로 외부를 가져온다. 내부는 읽기 전용으로 두는 것이 안전하다 |
| 내부 → 외부 | Push mirror | 내부의 변경을 외부로 민다. 사실상 강제 푸시라 외부의 변경을 덮는다 |
Forgejo 에서는 저장소를 만들 때 New Migration 에서 원본 URL 을 넣고 This repository will be a mirror 를 체크하면 pull mirror 가 된다. 이후 주기는 저장소 설정에서 바꾼다.
양방향 미러는 두지 않는다. 양쪽에서 커밋이 생기면 어느 쪽이 이겨도 한쪽 작업이 사라진다. 쓰기를 받는 쪽을 하나로 정하고 나머지는 읽기 전용으로 둔다.
개인 작업 저장소에서 두 곳에 밀어 넣는 방식이다. 가장 단순하고 통제하기 쉽다.
git remote add forgejo ssh://git@forgejo.internal:2222/company/project.git
git remote -v
git push origin main
git push forgejo main
브랜치와 태그 전체를 밀려면 다음을 쓴다.
git push origin --all
git push origin --tags
한 번의 git push 로 양쪽에 보내려면 push URL 을 여러 개 등록한다.
git remote set-url --add --push origin https://github.com/company/project.git
git remote set-url --add --push origin ssh://git@forgejo.internal:2222/company/project.git
git remote -v
주의할 점이 있다. --add --push 를 처음 쓰는 순간 기본 push URL 이 사라지고 추가한 것만 남는다. 원래 주소도 목록에 반드시 포함시킨다. 그리고 가져오기(fetch)는 여전히 첫 번째 URL 한 곳에서만 한다. 두 원격의 내용이 갈라지면 이 방식으로는 감지되지 않는다.
| 상황 | 방법 |
|---|---|
| 호스트를 완전히 옮긴다 | --mirror 클론 후 --mirror 푸시 |
| 외부가 원본이고 내부는 사본 | Pull mirror |
| 내부가 원본이고 외부에 공개 | Push mirror 또는 CI 에서 푸시 |
| 개발자가 두 곳에 직접 올린다 | 원격 두 개 또는 push URL 두 개 |
git ls-remote origin | head
git ls-remote forgejo | head
git rev-parse origin/main forgejo/main
두 원격의 같은 브랜치 해시를 비교하면 동기화 상태를 바로 알 수 있다. 미러를 자동화했다면 이 비교를 점검 스크립트에 넣어 어긋남을 감지한다.