레포지터리 이관
소스코드 관리를 위해 사용하던 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
방문해 주셔서 감사합니다!
정보가 도움이 되셨다면
로그인하지 않아도 누룰 수 있는
아래의 ♡ (하트) 를 꾹~ 눌러주세요 ♥♥♥
'IT > 형상관리' 카테고리의 다른 글
Jenkins 로 빌드 및 배포 자동화 구성하기 (0) | 2022.05.29 |
---|---|
GitLab 으로 소스코드 관리하기 (0) | 2022.05.29 |
Git 저장소의 커밋 기록에서 대용량 파일을 삭제하기 (0) | 2022.05.10 |
Gitlab root 패스워드 변경 방법 (0) | 2021.06.17 |
SVN CLI 사용 방법 (0) | 2021.03.30 |