콘텐츠로 건너뛰기
Home » Blog » gitlab에서 github로 커밋 옮기기

gitlab에서 github로 커밋 옮기기

git 커밋은 기본적으로 로컬의 config에 정의된 name과 email로 제출된다.

SSAFY에서 gitlab을 활용해서 프로젝트를 진행했는데 이를 github으로 옮기는 작업이 필요했다.

팀원들 중 몇몇은 github email이 gitlab에 등록된 email과 동일해서

옮기더라도 그대로 커밋의 잔디나 유저 프로필 링크가 연결되었지만

나 같은 경우는 그렇지 않아서 commiter 및 author를 변경하는 작업을 해야만 했다.


1. gitlab clone 후 옮기고 싶은 레포지토리로 checkout하기

(주황색은 옮기고 싶은 대상, 파란색은 옮길 목적지이다)

새로운  프로젝트를 생성하고 gitlab 의 해당 레포지토리를 clone받는다.

옮기고 싶은 해당 브랜치로 체크아웃을 한다.

본인의 경우에는 gitlab의 be-deploy라는 브랜치(백엔드 배포 브랜치)를

github의 새로운 organization의 backend 레포지토리로 옮기는 과정이 필요했다.


2. config 교체 후 루트 디렉토리로 경로 변경

SSAFY에서 진행된 프로젝트는 레포지토리 하나로 진행됐다.

최상위 경로에서 backend, frontend로 디렉토리를 레포지토리처럼 나눠서 쓰는 구조였다.

backend 디렉토리만을 github organization의 백엔드 레포지토리로 옮기고자 한다.

먼저 config에서 user.name과 user.email을 깃허브 정보로 교체한다.

global로 진행해도되고 해당 로컬로 교체해도 좋다.

이후 frontend 디렉토리를 지우고,

backend 디렉토리 내의 모든 파일을 최상위 경로로 이동시킨뒤,

이후 비어있는 backend 디렉토리를 지우고,

커밋을 진행한다.


3. git remote 추가하기

깃허브의 레포지토리를 목적지로, remote를 추가한다.

git remote add [리모트 이름] [리모트 git repo 주소]

git remote -v 로 추가가 되었는지 확인한다.

제대로 연결이 되었다면 origin 에는 gitlab이, 추가된 리모트에는 리모트 git repo 주소 가 연결되어 있을 것이다.


4. commiter 변경하기

기본적인 틀은 다음과 같다.

git filter-branch --force --env-filter '
OLD_NAME="깃랩 이름"
CORRECT_NAME="깃허브 이름"
CORRECT_EMAIL="깃허브 이메일"

if [ "$GIT_COMMITTER_NAME" = "$OLD_NAME" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_NAME" = "$OLD_NAME" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' -- --all

깃랩 이름에는 교체하고싶은 깃랩에 커밋된 author의 이름을,

깃허브 이름과 깃허브 이메일에는 교체하고자 하는 깃허브에 커밋할 author의 정보를 적는다.

(본인의 깃허브 이메일에 정확한, 로그인 시 사용하는 이메일을 적도록 한다.)

이는 한명만 바꾸는 명령인데 여러명을 바꾸고 싶다면 다음과 같이 진행하면된다.

본인은 팀원 6명의 author를 모두 변경해야해서 이를 활용했다.

git filter-branch --force --env-filter '
OLD_NAME1="깃랩 이름1"
CORRECT_NAME1="깃허브 이름1"
CORRECT_EMAIL1="깃허브 이메일1"

OLD_NAME2="깃랩 이름2"
CORRECT_NAME2="깃허브 이름2"
CORRECT_EMAIL2="깃허브 이메일2"

OLD_NAME3="깃랩 이름3"
CORRECT_NAME3="깃허브 이름3"
CORRECT_EMAIL3="깃허브 이메일3"

OLD_NAME4="깃랩 이름4"
CORRECT_NAME4="깃허브 이름4"
CORRECT_EMAIL4="깃허브 이메일4"

OLD_NAME5="깃랩 이름5"
CORRECT_NAME5="깃허브 이름5"
CORRECT_EMAIL5="깃허브 이메일5"

OLD_NAME6="깃랩 이름6"
CORRECT_NAME6="깃허브 이름6"
CORRECT_EMAIL6="깃허브 이메일6"

if [ "$GIT_COMMITTER_NAME" = "$OLD_NAME1" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME1"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL1"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME2" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME2"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL2"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME3" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME3"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL3"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME4" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME4"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL4"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME5" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME5"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL5"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME6" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME6"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL6"
elif [ "$GIT_COMMITTER_NAME" = "$OLD_NAME7" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME7"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL7"
fi

if [ "$GIT_AUTHOR_NAME" = "$OLD_NAME1" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME1"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL1"
elif [ "$GIT_AUTHOR_NAME" = "$OLD_NAME2" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME2"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL2"
elif [ "$GIT_AUTHOR_NAME" = "$OLD_NAME3" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME3"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL3"
elif [ "$GIT_AUTHOR_NAME" = "$OLD_NAME4" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME4"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL4"
elif [ "$GIT_AUTHOR_NAME" = "$OLD_NAME5" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME5"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL5"
elif [ "$GIT_AUTHOR_NAME" = "$OLD_NAME6" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME6"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL6"
fi
' --tag-name-filter cat -- --all

다만..

팀원들 중 깃랩에 본인의 깃허브 계정을 써서 커밋을 했다던가..

하나의 아이디로만 커밋을 진행하지 않은 팀원들이 있다면

그거에 맞게 변수와 elif 문을 추가해주어서 진행하면된다.

이를 통해 커밋 히스토리를 순회하면서 이름 및 이메일을 모두 변경 완료하였다.


5. github에 push하기

이제 해당 브랜치를 github repository의 main으로 push 할 일만 남았다.

본인의 경우, be-deploy라는 branch를 main으로 push했다.

git push -f [추가한 리모트 이름] be-deploy:main
잔디도 잘 옮겨져서 심어졌다!

여기서 중요한점은…

절대로 “추가한 리모트 이름” 부분을 origin 으로 지정하지 말라는 것..

그렇게되면 gitlab main이 모두 덮어씌워질 것이다..

frontend 디렉토리도 이와같은 방법으로 push 하면된다.