git repository 통채로 복제

mook9288·2020년 12월 31일
0

Git 명령어 정리

목록 보기
4/6

기존의 repository를 새로운 repository나 다른 계정에 복제할 때,
commit 이력, branch 등의 내용을 전부 복제하는 방법이다.

로컬저장소에 저장소 복제하기

## 저장소 폴더 위치에서 진행
git clone --mirror REPOSITORY_URL

새로운 저장소에 복제 저장소 이력 복제하기

## 복제한 저장소로 이동
cd REPOSITORY.git

## 새 저장소에 히스토리 업데이트
git remote set-url --push origin NEW_REPOSITORY_URL

원격저장소 push

## 복제한 내용 원격에 올리기
git push --mirror


기존 저장소와 복제할 저장소 병합시

기존 저장소의 Branch 삭제

저장소가 복제되면서 기존의 저장소가 가지고 있던 Branch가 여러개인 경우 default Branch를 제외한 Branch가 삭제된다.
기존의 저장소가 로컬에 존재할 때, remote를 업데이트 하지않은 상태라면 기존의 Branch를 살릴 수 있다. 원격 저장소에서 삭제됐을뿐 로컬 저장소에는 아직 기록이 남아 있기 때문이다. 해당 Branch로 이동 후 원격에 push를 해주면 된다.

동일한 Branch 명 존재

복제할 저장소의 Branch명과 복제될 저장소의 Branch명이 서로 같은 경우, 복제될 저장소의 Branch에 커밋 이력이 있다면 전부 초기화되고, 복제되는 저장소의 Branch 커밋 이력이 복제된다. (커밋 이력을 덮어쓴다.)
복제될 저장소의 Branch를 보호하고 싶다면 미리 겹치지 않는 이름으로 Branch명을 변경하자.

복제된 Branch를 default Branch에 병합

복제된 Branch에 기존 Branch의 이력을 먼저 pull 받은 후 병합을 진행한다.

git pull origin BRANCH_NAME

복제된 Branch에 기존 Branch를 병합하게 되면 원격 저장소의 Branch에서 로컬 저장소의 FETCH_HEAD를 merge하는 것이 거부하는 오류가 발생한다. commit 히스토리가 서로 관련성이 없기 때문에 merge할 수 없다는 것이다.
merge는 원격 저장소와 로컬 저장소가 공통된 commit지점이 존재해야 가능하다. (현 상황은 fetch는 되었지만, merge가 되지 않은 상태)

서로 관련 commit이 없는 두 프로젝트를 병합을 허용해 주도록 아래 명령어를 실행해준다.

git pull origin BRANCH_NAME --allow-unrelated-histories

pull request 존재하는 경우, Error 발생

pull request가 존재 하는 경우, 문제가 발생할 수도 있다고 한다. (참고)


기존 저장소와 새 저장소의 계정이 다른 경우

기존 저장소(복제할 저장소)와 새 저장소의 계정이 다른 경우,
git push --mirror를 명령하게 되면 아래와 같은 문구가 나온다.

remote: Permission to 계정/새저장소 denied to 기존저장소계정.
fatal: unable to access 'NEW_REPOSITORY_URL': The requested URL returned error: 403

기존의 저장소와 복제될 새로운 저장소의 계정이 달라 접근이 불가하기 때문에 발생하는 상황이다. 이 문제는 계정 인증을 통해 해결할 수 있다.

git remote set-url origin "https://USER_NAME@github.com/USER_NAME/NEW_REPOSITORY_NAME.git"

위와 같이 입력하면 계정 인증을 진행할 수 있고 그 이후 push/pull이 가능해진다.

0개의 댓글