본문 바로가기
IT/형상관리

레포지터리 이관하기 - Git 저장소(레포지터리) 원격지 변경

by blogger 2021. 3. 26.

레포지터리 이관

 

소스코드 관리를 위해 사용하던 Git 저장소의 리모트 저장소 위치를 변경해야 할 상황이 생겼다.

Repository 수가 몇 개 되지 않는다면 수작업으로 새로운 리모트 저장소로 옮기면 되겠으나, 옮겨야 하는 저장소의 수가 많아서 반복 작업을 할 수 있도록 스크립트를 작성하기로 했다.

리모트 저장소를 변경할 경우 보통의 경우 원본 저장소의 모든 branch 와 tag 도 그대로 옮겨 이력이 보존되도록 해야 한다.

 

내 로컬이 아닌 기존의 리모트에 존재하는 브랜치와 태그를 새로운 리모트로 그대로 옮기기 위한 방법을 찾아보니 git 커맨드 옵션으로 지원이 되고 있었다. 다음과 같이 mirror 옵션을 사용해서 repository를 clone 후 push 하면 된다. 이때 push 를 하는 대상인 새로운 remote 의 저장소가 초기화 되니 주의해야 한다고 한다.

git clone <upstream-repo-url/repo.git> --mirror
cd <repo>
git remote add <your-remote-name> <your-remote-url/repo.git>
git push <your-remote-name> --mirror
출처 : https://stackoverflow.com/questions/37884832/git-push-all-branches-from-one-remote-to-another-remote

 

이제 새로운 원격지 저장소를 생성하기 위핸 Bitbucket API 를 찾아보자.

 

1.0 버전 API

curl -k -X POST --user user:pass "https://api.bitbucket.org/1.0/repositories" -d "name=project_name"
출처 : https://community.atlassian.com/t5/Answers-Developer-Questions/Can-I-create-a-bitbucket-repository-using-REST-API/qaq-p/528530 

 

2.0 버전 API

curl -X POST -H "Content-Type: application/json" -d '{
    "scm": "git",
    "project": {
        "key": "MARS"
    }
}' https://api.bitbucket.org/2.0/repositories/teamsinspace/hablanding
출처 : https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D#post

 

이제 이것들을 활용해서 스크립트를 작성해 보자.

다음의 스크립트는 Gitlab의 repository를 동일한 이름으로 Bitbucket repository로 이관하는 스크립트이다.

#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null 2>&1 && pwd )"

GITLAB_ID=
GITLAB_PWD=
GITLAB_PREFIX="http://${GITLAB_ID}:${GITLAB_PWD}@$127.0.0.1/gitlab/myproject/group/"

BITBUCKET_ID=
BITBUCKET_2FA_TOKEN=
BITBUCKET_PREFIX="https://${BITBUCKET_ID}:${BITBUCKET_2FA_TOKEN}@127.0.0.1/bitbucket/myproject/"
BITBUCKET_API_REPO_CREATE=

repos=(repo1 repo2 repo3)

for repo in ${repos[@]}; do
    echo "clone $repo from GitLab"
    cd $SCRIPT_DIR
    git clone ${GITLAB_PREFIX}${repo} --mirror $repo
    cd $repo

    echo "create bitbucket repo"
    curl $BITBUCKET_API_REPO_CREATE -X POST -d "name=${repo}" -H "Authorization: Bearer: BITBUCKET_2FA_TOKEN"
    
    git remote add bitbucket ${BITBUCKET_PREFIX}${repo}
    git push bitbucket --mirror
    echo ""
    echo ""
done

 

추가 요구 사항 발생!

레포지터리를 이관하는 과정에서 레포지터리 이름을 변경해야 한다.

A 이름의 레포지터리를 abc 라는 이름의 레포지터리에 이관해야 하는 경우, 위 스크립트를 그대로 사용하되, 레포지터리 목록을 관리하는 배열 변수 2개를 사용하고, for loop 를 index로 돌리면 된다.

 

#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null 2>&1 && pwd )"

GITLAB_ID=
GITLAB_PWD=
GITLAB_PREFIX="http://${GITLAB_ID}:${GITLAB_PWD}@$127.0.0.1/gitlab/myproject/group/"

BITBUCKET_ID=
BITBUCKET_2FA_TOKEN=
BITBUCKET_PREFIX="https://${BITBUCKET_ID}:${BITBUCKET_2FA_TOKEN}@127.0.0.1/bitbucket/myproject/"
BITBUCKET_API_REPO_CREATE=

repos=(repo1 repo2 repo3)
newrepos=(newrepo1 newrepo2 newrepo3)

for ((i=0; i<3; i++))
do
	repo=${repos[${i}]}		# 기존 레포지터리 이름
    echo "clone $repo from GitLab"
    cd $SCRIPT_DIR
    git clone ${GITLAB_PREFIX}${repo} --mirror $repo
    cd $repo
	
    newrepo=${newrepos[${i}]}		# 새로운 레포지터리 이름
    echo "create bitbucket repo - ${newrepo}"
    curl $BITBUCKET_API_REPO_CREATE -X POST -d "name=${newrepo}" -H "Authorization: Bearer: BITBUCKET_2FA_TOKEN"
    
    git remote add bitbucket ${BITBUCKET_PREFIX}${newrepo}
    git push bitbucket --mirror
    echo ""
    echo ""
done

 

 

방문해 주셔서 감사합니다!
정보가 도움이 되셨다면

로그인하지 않아도 누룰 수 있는
아래의 ♡ (하트) 를 꾹~ 눌러주세요 ♥♥♥