본문 바로가기
Application/Git

로컬 디렉토리를 Github로 동기화하기 (Github CLI, gh)

by wrynn 2022. 12. 6.

 로컬에서 작업하다 보면 작업 디렉토리를 그대로 원격 Github 리포지토리에 동기화하고 싶은 경우가 있습니다. 이럴 때 Github CLI를 사용하면 CLI로 손쉽게 Github 와 상호작용할 수 있습니다. 본문에서는 Github CLI를 사용하여 원격 리포지토리를 생성하고, 로컬 리포지토리를 원격 리포지토리와 동기화시켜 보겠습니다. Linux 환경이 아니라 Mac이나 Windows의 경우 링크된 Github docs 페이지를 참고해주세요.

사전 준비사항


1. 로컬 리포지토리 구성

 먼저 원격 리포지토리와 동기화할 로컬 리포지토리를 생성해 보겠습니다. 로컬 디렉토리를 새로운 Git 리포지토리로 만들기 위해서는 아래와 같이 작업 디렉토리로 이동한 다음, git init 명령을 사용합니다. <working_directory> 대신 실제 작업 경로를 사용합니다.

$ cd <working_directory>
$ git init -b main

 이렇게 하면 원격 리포지토리와 동기화 할 로컬 리포지토리가 구성됩니다. 최초 커밋할 내용을 git add 명령으로 staging area에 추가하고, git commit 명령으로 커밋을 생성합니다. 

$ git add .
$ git commit -m "initial commit"

 만약 초기 커밋을 생성할 내용이 아직 없거나 원하지 않는 경우에는 바로 2. Github CLI 설치 및 인증정보 설정 부분으로 건너뛰어도 좋습니다.

 

2. Github CLI 설치 및 인증정보 설정

2.1. Github CLI 설치

 Github CLI 도구인 gh를 설치하고 인증 정보를 설정하는 방법에 대하여 알아보겠습니다. 여기서는 AWS EC2에서 주로 사용되는 Amazon Linux 2에 설치하는 방법을 다루며, 다른 리눅스 배포판에 대해서는 Github CLI 공식 리포지토리의 문서를, 다른 OS에 설치하는 방법에 대해서는 Github CLI 공식 웹사이트의 설치 방법을 참고해 주세요.

 아래 명령으로 Github CLI(gh)를 설치합니다. 설치에는 yum을 사용합니다. 

$ sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
$ sudo yum install gh

 다음과 같이 설치가 정상적으로 이루어진 것을 확인할 수 있습니다.

$ which gh
/usr/bin/gh
$ gh version
gh version 2.20.2 (2022-11-15)
https://github.com/cli/cli/releases/tag/v2.20.2

 

2.2. Github 액세스 토큰 발급

 설치는 완료되었지만, 사용하기 전에 Github에 로그인하기 위한 인증 키 정보를 설정해 주어야 합니다. 웹 브라우저로도 간편하게 인증할 수 있지만, 클라우드와 같은 제한된 환경에서는 웹 브라우저를 통한 인증을 수행하기가 어렵습니다. 따라서 개인 액세스 토큰을 발급받아 등록하는 방식으로 설정해 보겠습니다.

 Github 웹 브라우저에 로그인하여 상단 프로파일 아이콘 > Settings 항목을 선택합니다.

 좌측 하단의 Developer settings > Personal access tokens > Tokens (classic)를 클릭한 다음, 나타나는 화면 우측 상단에 Generate new token > Generate new token (classic)을 선택합니다.

참고) 최근에 새로 추가된 Github의 Fine-grained tokens를 사용하는 경우, GraphQL API를 지원하지 않으므로 Github CLI를 사용할 수 없습니다. 자세한 내용은 Github CLI - Issues#6680을 참고하세요.

 

 Generate new token (classic)을 선택하면 새로운 토큰을 생성하는 페이지로 이동합니다. Note에 임의의 토큰의 이름을 지정한 다음 Select scopes에서 repo와 admin:org 체크 후 아래 Generate token 버튼을 클릭하여 토큰을 생성합니다.

 

 이제 토큰 생성이 완료되었습니다. ghp로 시작하는 액세스 토큰을 복사한 다음 이어서 진행합니다. 

 액세스 토큰은 이 화면을 벗어나면 다시 확인할 수 있는 방법이 없으므로 따로 기록해두거나, 본 실습이 끝날 때 까지는 이 페이지를 유지합니다. 만약 액세스 토큰을 잃어버렸다면 사용하지 않는 토큰은 삭제 후 2.2 Github 액세스 토큰 발급 부분을 다시 수행합니다.

 

2.3. Github CLI 인증정보 설정

 다시 Linux 호스트로 돌아와서 홈 디렉토리에 토큰 값을 가지는 파일 하나를 생성합니다. 아래는 샘플 토큰을 사용하였으므로 실제 명령 수행시에는 각자 자신이 발급받은 토큰을 사용합니다.

$ cd <working_directory>
$ echo ghp_Teiqn8ThisIsSampleTokenCLtKHDT1yZDn1 > ~/mytoken.txt

 gh auth login으로 Github 로그인 인증정보를 설정합니다.

$ gh auth login --with-token < ~/mytoken.txt

 gh auth status로 로그인이 정상적으로 이루어졌는지 확인할 수 있습니다.

$ gh auth status
github.com
  ✓ Logged in to github.com as john_doe (oauth_token)
  ✓ Git operations for github.com configured to use https protocol.
  ✓ Token: *******************

 이제 gh 명령을 사용할 수 있는 환경 구성이 끝났습니다. gh를 사용하여 Github 원격 리포지토리를 생성하고, 로컬 리포지토리의 파일을 업로드하는 방법을 아래에서 추가로 알아보겠습니다.

 

3. Github 연동

3.1. 원격 리포지토리 생성

 Github 프로젝트를 생성하려면, 다음 명령을 수행합니다.

$ gh repo create

 명령 수행 시 몇가지 설정 사항을 묻습니다. 제일 처음 나타나는 질문에서 우리는 로컬 리포지토리를 Github에 저장하는 것을 원하므로 Push an existing local repository to GitHub를 선택합니다. 다음 질문들은 Enter 키를 입력하여 기본 값으로 설정합니다.

? What would you like to do? Push an existing local repository to GitHub
? Path to local repository .
? Repository name my_sample_repo
? Description my_sample_repo
? Visibility Public
✓ Created repository john_doe/my_sample_repo on GitHub

 

3.2. 원격 브랜치 추가

 여기까지 수행하면 Github에 리포지토리가 생성된 것을 확인할 수 있습니다. 그 다음에 바로 이어서 원격 브랜치를 추가하는 질문이 이어집니다. Yes를 입력하여 계속 진행합니다.

? Add a remote? Yes
? What should the new remote be called? origin
✓ Added remote https://github.com/john_doe/my_sample_repo.git

 

3.3. 로컬 리포지토리와 동기화

 원격 브랜치를 추가한 다음에는 커밋을 원격으로 Push할 것인지 물어봅니다. Push를 수행하려고 하면 Github의 계정과 비밀번호를 물어봅니다. 여기서 계정은 그대로 사용하되 비밀번호 란에는 복사해둔 액세스 토큰 값을 사용하여 로그인합니다.

? Would you like to push commits from the current branch to "origin"? Yes
Username for 'https://github.com': john_doe
Password for 'https://john_doe@github.com': # Github Personal Access Token 값 사용

 정상적으로 Push가 이루어 지면 다음과 같은 출력이 나타납니다.

Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 2.71 KiB | 1.35 MiB/s, done.
Total 11 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/john_doe/my_sample_repo.git
 * [new branch]      HEAD -> master
branch 'master' set up to track 'origin/master'.
✓ Pushed commits to https://github.com/john_doe/my_sample_repo.git

 Github 웹 페이지에서도 정상적으로 리포지토리가 생성되었고 커밋이 푸시된 것을 확인할 수 있습니다.


참고자료

[1] https://github.com/cli/cli/blob/trunk/docs/install_linux.md

[2] https://cli.github.com/manual/installation

[3] https://docs.github.com/en/get-started/importing-your-projects-to-github/importing-source-code-to-github/adding-locally-hosted-code-to-github

댓글