GitHub의 공식 CLI 1.0 버전이 릴리스되었다.
GitHub CLI는 깃헙을 CLI로 쉽게 사용할 수 있는 CLI 도구이고 이전에는 hub라는 CLI를 제공하고 있었는데 문서에 따르면 hub
를 이용할까 고민하다가 장기적인 설계 관점과 git의 별칭으로 사용되는 부분을 제외하기 위해서 새로 만들었고 기존에 hub
에 익숙한 사람들의 사용패턴을 바꾸고 싶지도 않았다고 한다. GitHub CLI는 gh
명령어를 사용하는데 gh
를 만들었다고 hub
를 없애거나 하진 않을 것이라고 한다.
나는 기존에 ghi를 비슷한 용도로 쓰고 있었는데(그래서 hub
로 넘어가지 못했다.) 더는 관리되지 않고 gh
가 잘 나온 것 같아서 이번 기회에 gh
로 갈아탔다.
설치 및 설정
문서에 OS별 설치 방법이 나와 있고 macOS에서는 brew install gh
로 간단히 설치할 수 있다.
$ gh --version
gh version 1.0.0 (2020-09-16)
https://github.com/cli/cli/releases/tag/v1.0.0
gh
는 Go 언어로 작성되었다.
내 GitHub를 CLI에서 사용하는 도구이므로 GitHub의 권한이 필요한데 gh auth login
으로 인증을 받을 수 있다.
GitHub.com인지 엔터프라이즈인지를 선택하고 브라우저로 로그인하기를 선택하고(이미 API 키가 있으면 API를 입력하는 방법을 선택할 수도 있다.) 엔터키를 누르면 브라우저가 열린다.
앞에서 CLI에 보인 코드를 브라우저에서 입력하고 "Continue"를 누르면
사용되는 권한이 표시되는데 GitHub을 다 사용해야 하므로 대부분의 권한이 들어있다. "Authorize github"를 누르면 된다.
브라우저에서 권한 부여가 완료되면 자동으로 로그인 과정이 다음 과정으로 넘어간다. 사용할 git 프로토콜만 지정하면 되는데 나는 HTTPS 보다는 SSH를 선호하므로 SSH를 선택했다.
$ gh auth status
github.com
✓ Logged in to github.com as outsideris (~/.config/gh/hosts.yml)
✓ Git operations for github.com configured to use ssh protocol.
로그인 상태를 확인하려면 gh auth status
를 이용하면 된다. gh auth -h
로 인증 관련 명령어의 자세한 내용을 볼 수 있다.
$ gh auth -h
Manage gh's authentication state.
USAGE
gh auth <command> [flags]
CORE COMMANDS
login: Authenticate with a GitHub host
logout: Log out of a GitHub host
refresh: Refresh stored authentication credentials
status: View authentication status
INHERITED FLAGS
--help Show help for command
LEARN MORE
Use 'gh <command> <subcommand> --help' for more information about a command.
Read the manual at https://cli.github.com/manual
저장소 관리
새로운 git 저장소를 만들려면 gh repo create [<name>]
를 사용하면 된다.
$ gh repo create cli-example
? Visibility Public
? This will create 'cli-example' in your current directory. Continue? Yes
✓ Created repository outsideris/cli-example on GitHub
? Create a local project directory for outsideris/cli-example? Yes
Initialized empty Git repository in /Users/outsider/temp/cli-example/.git/
✓ Initialized repository in './cli-example/'
공개/비공개 저장소를 선택하고 로컬에도 클론 받은 디렉터리를 만들 것인지를 선택하면 로컬뿐 아니라 GitHub에도 저장소가 만들어진다. 새로운 프로젝트를 만들 때 디렉터리를 생성하고 git init
을 한 뒤에 원격 저장소에 푸시할 필요 없이 한 번에 생성할 수 있어서 편하다. --description string
플래그로 저장소 설명을 추가하거나 --enable-issues
/--enable-wiki
로 이슈/위키의 활성화 여부 등을 지정할 수도 있다.
GitHub의 프로젝트를 클론 받으려면 gh repo clone <repository>
를 사용하면 된다. https://github.com/cli/cli의 저장소가 있다면 앞의 뒤의 경로 부분인 cli/cli
만 지정해도 클론 받을 수 있다.
$ gh repo clone cli/cli
Cloning into 'cli'...
remote: Enumerating objects: 50, done.
remote: Counting objects: 100% (50/50), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 14070 (delta 25), reused 34 (delta 17), pack-reused 14020
Receiving objects: 100% (14070/14070), 32.57 MiB | 7.97 MiB/s, done.
Resolving deltas: 100% (9379/9379), done.
보통 GitHub 프로젝트를 작업하려면 github.com에서 해당 저장소를 포크한 뒤에 로컬에서 클론을 받고 원 저장소도 리모트 저장소로 추가해야 하는데 이런 작업도 gh repo fork
로 간단히 할 수 있다.
$ cd cli
$ gh repo fork
- Forking cli/cli...
✓ Created fork outsideris/cli
? Would you like to add a remote for the fork? Yes
✓ Renamed origin remote to upstream
✓ Added remote origin
$ git remote -v
origin git@github.com:outsideris/cli.git (fetch)
origin git@github.com:outsideris/cli.git (push)
upstream git@github.com:cli/cli.git (fetch)
upstream git@github.com:cli/cli.git (push)
앞에서 cli/cli
를 클론 받은 디렉터리에 들어가서 gh repo fork
를 실행하면 github.com에 포크한 저장소도 만들어 주고 현재의 git 프로젝트에 리모트로도 추가해준다. 일반적인 관례대로 포크한 저장소는 origin
으로 원 저장소는 upstream
으로 변경해줘서 편하다.
gh repo view --web
을 입력하면 바로 웹브라우저에서 해당 저장소를 열어서 볼 수 있다.
$ gh repo view --web
Opening github.com/cli/cli in your browser
이슈 관리
작업하다가 이슈를 다시 확인하고 싶거나 다른 이슈를 찾아보고 싶을 때도 gh issue list
로 바로 확인해 볼 수 있다.
$ gh issue list
Showing 30 of 309 open issues in cli/cli
#2001 gh pr create when branch is ... (enhancement) about 8 hours ago
#2000 Support different default OW... (enhancement) about 4 hours ago
--assignee
, --author
, --label
, --state
로 이슈를 필터링해서 볼 수 있고 --web
을 지정하면 바로 웹브라우저로 열어서 볼 수 있다.
gh issue view {<number> | <url>}
로 특정 이슈를 자세히 볼 수도 있다.
$ gh issue view 2000
Support different default OWNER in `gh repo clone REPO`
Open • Moser-ss opened about 13 hours ago • 1 comment
Labels: enhancement
### Describe the feature or problem you’d like to solve
The feature to have the authenticated user as default OWNER when clone the
repo is very neat, but for some people that could not be enough. For example
for people that work a lot inside of a specific organization could be nice
to set a different default owner
### Proposed solution
using the gh config we could set a default owner, like gh config owner acme
Then every time we use the gh repo clone we don't need to specify the owner
View this issue on GitHub: https://github.com/cli/cli/issues/2000
gh issue create
, gh issue close
, gh issue reopen
등으로 이슈를 CLI에서 바로 관리할 수도 있는데 내 패턴에서는 이런 부분은 특별한 때 말고는 웹에서 하는 게 더 편한 것 같긴 하다.
gh issue status
를 더 자주 쓸 것 같은데 이슈 상태 보기를 하면 나에게 할당된 이슈, 멘션 된 이슈, 내가 오픈한 이슈를 모아서 볼 수 있다.
$ gh issue status
Relevant issues in mochajs/mocha
Issues assigned to you
There are no issues assigned to you
Issues mentioning you
#4421 Separately run each async t... (needs-mcve, unconfirmed-bug) about 8 hours ago
#4182 Xunit reporter Failure node... (reporter) about 3 months ago
Issues opened by you
#4415 Print wrong count concurren... (confirmed-bug, parallel) about 1 month ago
#4047 Unhandled exception of`--fi... (confirmed-bug, good-first-... about 4 months ago
Pull Request 관리
Pull Request도 이슈처럼 관리할 수 있다.
$ gh pr list
Showing 23 of 23 open pull requests in cli/cli
#2005 Small readability and code organization ... small-refactors
#2004 issue create: Add --self-assign flag marclop:f/add-self-assign-flag-to-issue-...
#2003 Refactor gist create to reuse existing s... cristiand391:refactor-gist-create
#1994 Don't override user provided title and b... msfjarvis:pr-create-fill-priority
gh pr close
, gh pr merge
, gh pr ready
, gh pr reopen
등으로 Pull Request의 상태를 관리할 수 있고 gh pr status
로 나와 관련된 Pull Request의 상태도 볼 수 있다.
Pull Request 생성하기
PR을 올리는 과정을 생각해 보면 브랜치를 따서 작업이 완료되면 원격 저장소에 푸시를 하고 github.com에 가서 알림으로 올라온 PR을 눌러서 제목과 내용을 작성해서 PR을 생성하게 된다. gh pr create
도 편리한 기능으로 로컬에서 바로 Pull Request를 생성할 수 있다.
위처럼 브랜치에서 실행하면 푸시할 타겟 저정소와 제목/내용을 입력한 뒤에 바로 submit할지 더 작성할 내용이 있어서(예를 들면 이미지?) 브라우저에서 이어서 작업할 지등을 선택할 수 있다. Submit을 선택하면 바로 Pull Request까지 생성되는 것을 알 수 있다. 터미널에서 작업하다가 브라우저를 왔다갔다 할 필요없이 간단히 PR을 올릴 수 있다.
특정 Pull Request 체크아웃하기
gh
에서 가장 맘에 드는 기능이다. 지금까지는 GitHub의 Pull Request를 로컬로 가져오기에서 설명했던 대로 git에 alias를 설정해서 git pr 1234
처럼 사용하면서 특정 Pull Request를 로컬에서 받아오도록 사용했다.
정확히 이 기능을 해주는 명령어인데 보통 저장소의 메인테이너일 때 유용하다. 올라온 Pull Request를 리뷰할 때 로컬에서 소스 코드를 가져와서 테스트해보고 싶을 때가 있는데 이때 gh pr checkout {<number> | <url> | <branch>}
로 특정 PR을 바로 가져올 수 있다.
~/projects/cli on trunk@1b029c76
$ gh pr checkout 2003
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (16/16), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 16 (delta 11), reused 16 (delta 11), pack-reused 0
Unpacking objects: 100% (16/16), done.
From github.com:cli/cli
* [new ref] refs/pull/2003/head -> refactor-gist-create
Switched to branch 'refactor-gist-create'
~/projects/cli on refactor-gist-create@b71e6494
2003
PR을 가져오고 싶으면 gh pr checkout 2003
처럼 사용하면 되는데 해당 Pull Request를 가져와서 브랜치 변경을 해주어서 바로 로컬에서 테스트해볼 수 있다.
기능을 둘러보니 만족스러워서 코딩하면서 자주 사용하게 될 것 같다.
Comments