이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

GitHub에서 GitLab으로 미러링하기

  • 2022.06.22 16:05
  • Git/Git Note
글 작성자: Coding Groot
GitHub → GitLab 미러링은 GitHub Actions를 쓰면 쉽게 가능합니다.

1. 먼저 필요한 비밀 환경변수(SECRET)를 추가해 줍니다.

제가 쓸 명령어에서 필요로 하는 데이터는 3개입니다.

  1. 동기화될 GitLab 저장소 주소 (ssh주소가 아닌 HTTP주소)
  2. PUSH 권한을 가진 GitLab 유저명
  3. PUSH 권한을 가진 GitLab 계정의 토큰(TOKEN)

위의 정보를 각각 클론 할 GitHub repository의 Actions secrets으로 저장했습니다.
Secret명은 각각 TARGET_URL, TARGET_USERNAME, TARGET_TOKEN로 했습니다.

토큰은 외부에 유출되지 않도록 조심하세요!


여기서 말하는 토큰(Token)이란?
토큰은 발급할 때 특정한 권한을 주고 비밀번호 대신 사용해서 부여한 권한에 한해서 사용할 수 있습니다.

GitLab 토큰 생성법

GitLab 계정의 Token은 다음과 같이 발급하면 됩니다.

GitLab 토큰은 GitLab 사이트에 로그인한 후 Preference > Access Token에서 생성할 수 있습니다.

토큰 이름과 만료기간을 적고 용도에 따라 필요한 권한을 넣어줍니다.

저는 repository에 push 할 용도로만 사용할 것이라서 write_repository 권한만 줬습니다.


2. 아래 Actions를 넣고 Commit 합니다.

GitHub 저장소의 main branch에 Push하거나 PR을 보낼 때마다 GitLab 저장소 Force Push 하는 Action입니다.

아래 workflow 코드를 "원하는파일명.yml"로 설정하신 뒤 GitHub 저장소의 .github/workflows/ 아래에 넣으면 됩니다.  

이것처럼 넣어주면 끝!

# This is a workflow that syncs everthing on this repository to another repository

name: Sync this repository to another repository

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  push-to-gitlab:
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0 # Fetch all history for all tags and branches
      
      - name: Set remote repository
        env: # Retrieve env variable from GiGHub secrets
          gitlab_url: ${{ secrets.TARGET_URL }}
          gitlab_username: ${{ secrets.TARGET_USERNAME }}
          gitlab_token: ${{ secrets.TARGET_TOKEN }}
        run: | # 토큰을 조합해서 저렇게 URL을 만들면 비번없이 push가 됩니다.
          git remote add gitlab https://${gitlab_username}:${gitlab_token}@${gitlab_url#https://};
      - name: Force push everthing
        run: | # 모든 브랜치와 태그에 대하여 push합니다. gitlab에서 보호설정이 걸려있으면 Fail할 수 있습니다.
          git push -f --all gitlab;
          git push -f --tags gitlab;

이 액션을 실행하면 현재 GitHub Repository를 우분투상에서 clone하고 secrets에 넣어준 GitLab정보들로 인증해서 Target 저장소에 Force Push합니다.

영어, 한국어로 이것저것 주석을 달았습니다. 궁금하신 분들은 읽어보세요!

* 만약 main 브랜치뿐만이 아니라 모든 브랜치에 해당 job을 실행하고 싶으면 "main"을 "**"로 바꿔주면 됩니다.
   (Default값이 "**"이므로 위 코드의 branches: ["main"] 부분을 삭제해줘도 됩니다.) 

* 다른 저장소를 나타내는 부분에 GitLab이라는 변수명을 사용했지만 그냥 git 명령어로 원격 저장소 주소 저장하고 거기로 push하는 일반적인 명령어라 GitLab말고도 다 가능할 겁니다!


성공하는 경우

Actions 성공 스샷


Fail하는 경우

더보기

GitLab상에서 그 브랜치가 protected로 설정된 경우 Fail 할 수도 있습니다.  

기본적으로 GitLab에서 Force 푸시로 인해 소스코드가 손실되는 것을 막아줍니다. 하지만 우린 직접 작업하고 사용하는 메인은 깃헙에 두고 깃랩에는 단순히 복제하게 하려는 경우이므로 옵션을 꺼줘도 상관없습니다. 

프로젝트 저장소의 Settings > Repository에 가서 브랜치가 protected로 설정되어 있는지 확인합니다. protected되어 있다면 그 브랜치를 unprotected로 만들어주세요..

저는 다 꺼서 모든 태그와 브랜치가 protected되어 있지 않도록 했습니다

Reference

  • https://github.com/wangchucheng/git-repo-sync
 

GitHub - wangchucheng/git-repo-sync: Git Repo Sync enables you to synchronize code to other code management platforms, such as G

Git Repo Sync enables you to synchronize code to other code management platforms, such as GitLab, Gitee, etc. - GitHub - wangchucheng/git-repo-sync: Git Repo Sync enables you to synchronize code to...

github.com

그냥 여기에 있는 액션 가져다 써도 됩니닷 ㅎㅎ

반응형

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • Fork한 저장소에 upstream의 최신 commit 가져오기 :: GitHub Compare / Bitbucket / add remote

    Fork한 저장소에 upstream의 최신 commit 가져오기 :: GitHub Compare / Bitbucket / add remote

    2020.04.09
  • Git의 파일 상태 구분법

    Git의 파일 상태 구분법

    2020.04.09
  • Git Internals 정리 :: Git은 어떻게 동작할까?

    Git Internals 정리 :: Git은 어떻게 동작할까?

    2020.03.16
  • .gitignore가 동작 안할 때 상황별로 해결하기

    .gitignore가 동작 안할 때 상황별로 해결하기

    2020.02.29
다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (188)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (20)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • git
  • tutorial
  • 회고
  • javascript
  • 서평
  • aws
  • Github
  • 한빛미디어
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바