#!if 넘어옴1 != null
'''gh'''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다.
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 한국의 연예기획사}}}에 대한 내용은 [[GH엔터테인먼트]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[GH엔터테인먼트#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[GH엔터테인먼트#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.
#!if 리스트 != null
{{{#!if 문서명1 != null
* {{{#!if 설명1 != null
한국의 연예기획사: }}}[[GH엔터테인먼트]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[GH엔터테인먼트#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[GH엔터테인먼트#|]] 부분}}}}}}{{{#!if 문서명2 != null
* {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
* {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
* {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
* {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
* {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
* {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
* {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
* {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
* {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}
[[GitHub| | ||
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px" {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin: -5px -1px -11px" | <colbgcolor=#000,#000><colcolor=#fff,#fff> 관련 인물 | 톰 프레스턴 워너 |
서비스 | 저장소 · GitHub Pages · GitHub Action · GitHub Packages · GitHub Wiki · GitHub Gist · GitHub Copilot | |
클라이언트 | GitHub CLI · GitHub Desktop | |
오픈 소스 | Electron · Atom · Tree-sitter | |
관련 문서 | 사건 사고 · GitHub Universe · npm | }}}}}}}}} |
<colbgcolor=#000,#000><colcolor=#fff,#fff> GitHub CLI | |
개발 | GitHub |
출시 | 2020년 9월 17일# |
안정 버전 | v2.79.0 (2025년 9월 9일)# |
언어 | Go |
플랫폼 | Linux, macOS, Windows (i386, AMD64, ARM64, ARMHF) |
라이선스 | MIT 라이선스 |
링크 |
1. 개요
Take GitHub to the command line
GitHub API를 이용하여 GitHub의 다양한 기능을 터미널 환경에서 접근할 수 있도록 하는 공식 명령줄 인터페이스.
2. 설치
빌드된 바이너리가 공식 저장소 릴리즈 페이지에 올라오며, Linux, Windows, macOS를 지원한다. BSD 계열은 공식 지원은 없지만 ports에서 쉽게 찾을 수 있다.Nix에서는 home-manager 모듈로 올라와 있다. extension을 일반적인 동적 라이브러리로 링크할 수 없어
programs.gh.extensions
에 미리 선언해야 한다.winget에
GitHub.cli
로 올라와 있다.3. 명령어
내부적으로 cobra 프레임워크를 사용하기 때문에## 주 명령어-서브커맨드 형태의 구조를 이루고 있다.<rowcolor=#fff,#fff> 명령어 | 서브커맨드 | 비고 | |
<rowcolor=#fff,#fff> 코어 | |||
auth | GitHub API 인증 관련 명령어 | ||
login | GitHub 또는 GitHub Enterprise(회사 주소)에 로그인한다. 보통 브라우저 OAuth를 통해 인증하지만, GHA 등의 CI나 서버 등 헤드리스 환경에서 사용할 스크립트를 짜는 경우, GH_TOKEN 환경변수로 담거나 --with-token 으로 넘길 수 있다. 브라우저로 인증하는 경우, 기본적으로 gho_ 로 시작하는 OAuth 토큰을 반환한다. 기본 OAuth 토큰(gho_ )의 경우 스코프가 제한적이기 때문에 저장소의 워크플로우 등을 수정하기 위해서는 auth login 을 처음 사용할 시(또는 auth refresh ) -s 로 추가 스코프를 요청해야 할 수 있다.###. 여러 개의 계정을 사용하는 경우 계속해서 추가되고, 가장 마지막으로 로그인한 계정이 활성화된다.# 로컬 Git 저장소 안에 있을 경우, 리모트를 보고 자동으로 사용할 계정을 추론하지만, 이게 실패할 경우 수동으로 gh auth switch 를 해줘야 한다. | ||
logout | 현재 활성화된 계정의 토큰 및 인증 정보를 삭제한다. 내부적으로 hosts.yml 에서 로그아웃한 호스트의 엔트리 자체를 지워버리니 주의. | ||
refresh | 사용중인 API 액세스 토큰의 스코프 및 권한을 수정한다. 가령 GHCR 및 GitHub Packages를 조작하는 스크립트를 작성하려고 한다면 $ gh auth refresh -s read:packages 를 실행하는 식이다. refresh한다고 기존 토큰이 자동으로 만료되는 것은 아니며, 다른 GitHub credential이 필요한 다른 툴 등에 백업해두었다면 여전히 접근이 가능하므로 주의해야 한다. | ||
setup-git | .gitconfig 파일의 호스트별 credential helper 정보를 수정한다. 커밋 작성자 이름, 이메일 등 필드를 수정하는 것이 아니므로 주의. 대부분의 경우 gh auth login 할때 'Authenticate Git with your GitHub credentials?' 프롬프트에서 자동으로 실행된다. | ||
status | 현재 사용중인 인증 방법과 프로토콜, 액세스 토큰의 상태, 스코프를 보여준다. 단, 토큰이 fgPAT가 아니라 legacy token일 경우는 스코프 정보를 보여주지 않음에 주의. 여러 계정으로 로그인했을 경우 활성화 여부를 포함해 계정을 전부 보여주며, 로그인하지 않은 상태일 경우 정보를 표시하지 않는다. 다른 명령어들과 다르게 JSON 출력이나 go template을 지원하지 않기 때문에,#8637 스크립팅을 위해서는 gh api 를 사용해야 한다.(예시) | ||
switch | 여러 계정으로 로그인한 경우, 활성화(active로 표시)할 계정을 바꾼다. | ||
token | 현재 로그인한 계정의 액세스 토큰을 출력한다. 현재 fgPAT를 지원하지 않는다. github API를 직접 사용하는 스크립트 등을 작성할 때 유용한데, act 등을 사용할때 act -s GITHUB_TOKEN="$(gh auth token)" 처럼 gh에서 생성해주는 토큰을 바로 secrets로 넣어보낼 수 있다. 이외에도 GHCR, GitHub Packages 사용시 서버 환경에서 각종 docker login 등의 토큰 기반 인증 작업을 수행하거나 자동화 할 때 유용하다.[1] | ||
browse | 선택한 경로, 브랜치 등의 정보를 사용해 브라우저에서 자동으로 GitHub 저장소 창을 연다. 그 자체로는 별로 쓸모있는 것은 아니지만, 인자로 넘어온 특정 파일이나 폴더, 이슈, PR 등을 GitHub에서 열도록 하는 스크립트 등을 작성할 때 유용하다. 예를 들어 $ gh browse src/index.js:29 로 저장소의 src/index.js 파일의 29번째 라인을, $ gh browse 121 로 #121번 이슈/discussions/PR탭을 브라우저에서 열 수 있다. | ||
codespace | |||
gist | GitHub Gist 관련 명령어 | ||
clone | 해당 gist의 내부 저장소를 https://gist.github.com/.git 으로부터 로컬 파일시스템으로 클론한다. | ||
create | 주어진 파일들로 새 Gist를 생성한다. 파일명 인자로 - 를 주면 표준 입력을 대신 사용한다. | ||
delete | 해당 Gist를 삭제한다. | ||
edit | 해당 Gist를 수정한다. 기본적으로 vim을 열어 기존 내용을 수정할 수 있고, 새 파일 추가나 삭제를 해야 한다면 -a 나 -r 를 사용해야 하는데, 파일 추가/삭제와 파일 수정을 동시에 하는 것은 현재 불가능하다. | ||
list | 작성한 gist 및 ID를 표시한다. | ||
rename | |||
view | gist의 description 및 개별 파일 이름과 내용을 차례로 표시한다. -f 플래그를 주어 하나의 파일만 선택해 출력할 수 있다. | ||
issue | 이슈 트래커 관련 명령어 | ||
create | 새 이슈를 생성한다. 본문은 vim 등 별도의 에디터를 열어 작성하나, --body-file 등 인자로 stdin이나 파일에서 읽도록 스크립트화 할 수 있다. 로컬에 클론한 저장소에 .github 이슈 템플릿이 있다면 바로 복사해서 사용하나, 현재 프리뷰 기능인 issue form을 지원하지는 않는다. | ||
list | 이슈 목록을 출력한다. 기본적으로 현재 열린 이슈만을 보여준다. | ||
status | |||
close | 이슈를 닫는다. | ||
comment | 잠기지 않은 이슈 스레드에 새 댓글을 추가한다. GitHub App이나 Action output을 사용하지 않고 이슈 내에 간단히 알림이나 CI 체크 등을 출력하는 자동화 스크립트를 짤 때 유용하다. | ||
delete | |||
develop | |||
edit | |||
lock | |||
pin | |||
reopen | |||
transfer | |||
unlock | |||
unpin | |||
view | |||
org | list | 현재 로그인된 계정이 참여하고 있는 모든 organization을 나열한다. | |
pr | create | 병합되지 않은 브랜치에서 ahead 변경사항을 대상으로 PR을 작성한다. .github 폴더 하위의 PR 템플릿을 사용하는 경우, vim 등의 에디터에서 body를 수정할 수 있다. | |
list | |||
status | |||
checkout | 올라온 PR 변경사항을 로컬에 체크아웃한다. | ||
checks | |||
close | |||
comment | |||
diff | |||
edit | |||
lock | |||
merge | 선택한 PR을 머지한다. 웹 UI와 비슷하게 -r 로 리베이스를, -s 로 squash 머지를 할 수 있다. | ||
ready | |||
reopen | |||
review | |||
unlock | |||
update-branch | |||
view | |||
project | |||
release | |||
repo | create | GitHub에 새 저장소를 생성한다. interactive한 프롬프트가 나와 웹 UI의 /new 페이지에서 진행하는 저장소 생성, README 추가, .gitignore 추가, remote 추가, 기존 히스토리 push 등의 과정을 한번에 진행할 수 있다. | |
list | 특정 소유자(owner)가 소유하고 있는 모든 저장소를 보여주며, 아무 입력이 없다면 기본적으로 로그인한 사용자의 저장소들을 보여준다. | ||
archive | 저장소를 아카이브한다. 파괴적 동작인 만큼 프롬프트 기본값이 N인데, 배치로 돌리고 싶으면 -y 를 주어야 한다. | ||
autolink | |||
clone | 주어진 저장소를 로컬로 클론한다. GitHub의 저장소만 클론할 것을 가정하기 때문에 org/repo 형식의 깃허브 단축 경로를 사용할 수도 있으며, 자신이 소유한 저장소라면 소유자 경로를 생략할 수도 있다. 기본적으로 origin 리모트만 생성하는 git clone 과 다르게 포크한 저장소를 클론할 경우, 원본 리모트를 upstream 리모트로 자동 추가한다. 이 경우 PR을 보낼 때 웹 UI를 사용하지 않고 로컬에서 바로 보내는 것도 가능하다. 자세한 내용은 gh pr 명령어 참고. | ||
delete | 해당 저장소를 GitHub에서 삭제한다. 아카이브와 비슷하게 --yes 가 없다면 수동 확인이 필요하나, 아카이브와는 다르게 short flag인 -y 가 아예 없다. | ||
deploy-key | |||
edit | |||
fork | 주어진 저장소를 포크한다. | ||
gitignore | GitHub의 /new 등 화면에서 보여지는 github/gitignore 템플릿들을 조회하고 출력한다. .gitignore 특성상 append가 가능하기 때문에 기존의 보일러플레이트나 프로젝트 생성 툴 등이 미리 자체적인 .gitignore 를 생성해 두었거나 여러 언어/프레임워크를 사용하더라도, 조금 dirty하긴 하지만 하나로 쉽게 합칠 수 있다. 가령 $ gh repo gitignore view Rust >> .gitignore && gh repo gitignore view C++ >> .gitignore 로 C++와 Rust를 모두 사용하는 프로젝트를 쉽게 설정할 수 있다. | ||
license | GitHub에서 지원되는 주요 라이선스를 출력한다. 가령 $ gh repo license view MIT > LICENSE 로 /new를 사용할 때와 비슷하게 MIT 라이선스를 저장소에 추가할 수 있다. | ||
rename | 해당 저장소를 새 이름으로 이동한다. 웹 UI와 같이 기존 주소는 새 주소로 리다이렉트되며, 로컬에서 실행한 경우 리모트 주소 또한 수정한다. | ||
set-default | 로컬 저장소에 여러 리모트가 있는 경우, 다른 명령어(e.g. $ gh run )를 호출할 때 기본으로 사용할 리모트를 지정한다. | ||
sync | 포크가 있는 경우, upstream 리모트의 최신 커밋을 FF로 반영하고 변경된 사항을 origin에 자동으로 푸시한다. 이 경우 일반적으로 웹 UI에서 fork sync 버튼을 누르는 것과 비슷한 동작을 한다.# 목표 저장소를 명시하는 경우, remote-to-remote로 싱크가 가능하다. | ||
unarchive | 아카이브된 저장소를 아카이브 해제한다. | ||
view | 저장소의 README 파일을 렌더한다. 링크를 브라우저에서 열고 싶을 경우 gh browse -R 을 사용해야 한다. | ||
<rowcolor=#fff,#fff> 액션 | |||
cache | |||
run | GitHub Action 관련 명령어. 실행된 개별 실행(run)을 조회하고 관리할 수 있다. | ||
cancel | 해당 run을 정지시킨다. 이미 실패/성공한 run은 정지가 불가능하다. | ||
delete | 실행된 run을 삭제한다. 웹 UI에 있는 delete all logs 옵션은 딱히 구현되어 있지 않고, run의 통삭만이 가능하다. 웹 UI와 비슷하게 #으로 시작하는 run ID는 그대로 유지된다. | ||
download | |||
list | 해당 저장소의 모든 run을 나열한다. 주로 특정 run의 ID를 찾기 위해 쓰인다. 스크립트 작성 시 ID만 구하고 싶다면 jq로 $ gh run list --json 'databaseId' -q '.[].databaseId' 를 사용하면 된다. | ||
rerun | 완료된 run을 재실행한다. 인자 없이 실행할 경우, 실패한 run을 재실행한다. | ||
view | 주로 --log 를 통해 실행한/실패한 액션의 로그를 분석하거나 로컬로 저장하기 위해 사용된다. 기존의 웹 UI로는 액션 전체 로그를 복사하기 불편하기 때문. 웹 UI에서 /logs/job/job-logs.txt 로 들어가 나오는 주소를 curl 등으로 다운로드 해도 되지만, 여러 job 로그를 한번에 다운받는다면 $ gh run view <Run ID> --log -v > log 등을 사용하는 것이 편하다. | ||
watch | 주어진 run의 스텝과 실행 결과를 터미널에서 실시간으로 보여준다. 웹과 다르게 로그 실시간 출력은 현재로썬 불가능하다.#3484 | ||
workflow | GitHub Action 관련 명령어. run과 다르게 실제 .github/workflows/*.yml 파일 단위의 워크플로우 정의를 조작하는 명령어이다. 인자로 워크플로우를 받는 경우, ID 대신 파일 경로를 사용할 수 있다. 예를 들어, $ gh workflow run .github/workflows/build.yml 로 build.yml 에 정의되어 있는 액션을 실행할 수 있다. | ||
disable | 해당 액션을 비활성화한다. | ||
enable | 해당 액션을 활성화한다. | ||
list | 현재 저장소의 Action 워크플로우(.github/*.yml 파일)를 모두 나열한다. | ||
run | 선택한 액션을 수동으로 실행한다. 즉, workflow_dispatch 트리거에 반응하는 경우, 해당 이벤트를 호출한다. | ||
view | 해당 워크플로우 기반으로 실행된 최근 액션들을 보여준다. 사실 -y 옵션이 진가인데, 예를 들어 $ gh workflow view -R vitejs/vite publish.yml -y > .github/workflows/publish.yml 를 실행하면 Vite 공식 저장소에서 사용하는 배포 액션 정의 파일을 로컬에서 가져올 수 있다. | ||
<rowcolor=#fff,#fff> 기타 | |||
alias | |||
api | REST 엔드포인트 또는 GraphQL API를 사용하려면 api graphql 을 사용한다. 다른 HTTP 클라이언트를 사용해도 되지만 저장한 PAT가 없거나 인증 절차가 까다로운 경우, 깃헙 API를 터미널에서 간단히 테스트하거나 아예 API로 자동화하는 셸 스크립트를 짤 때 생각보다 유용하다. 다른 명령어와 같이 -q 플래그를 넣어 파이핑 없이도 jq를 사용할 수 있는데, JSON으로 긴 응답이 반환될 경우 유용하다. | ||
attestation | |||
completion | 각 셸(Bash, zsh, fish 등)별로 호환되는 자동완성 스크립트를 출력한다. | ||
config | |||
extension | browse | ||
create | |||
exec | |||
install | 주어진 저장소 주소로부터 확장을 설치한다. | ||
list | 현재 설치된 확장 및 버전을 나열한다. | ||
remove | 선택한 확장을 삭제한다. | ||
search | |||
upgrade | |||
gpg-key | |||
label | |||
ruleset | |||
search | GitHub의 레거시 Code Search 관련 기능. 최근 업데이트되어 웹 UI에서 제공되는 새 Code Search 엔진은 아직 구현되지 않았다.[2] | ||
code | |||
commits | |||
issues | |||
prs | |||
repos | |||
secret | |||
ssh-key | |||
status | GitHub에서 현재 assign된 이슈 및 PR, 코드 리뷰, 외부 멘션 등등의 알림을 표시한다. | ||
variable |
4. 특징
git cli와 다르게 GitHub 서비스 자체의 리소스(이슈, 액션 등) 관리 및 GitHub의 고유 워크플로(PR, 포크 등)와 관련된 작업에 관여한다. 간혹 있는 오해와 다르게 gh는 git의 superset이나 확장이 아니며 둘은 사용되는 용도와 목적이 분리되어 있어, 둘 다 같이 사용할 수 있다. 일반적으로 개발하면서 커밋 및 히스토리 관리, 브랜치 관리는 git cli로, PR 관리 등은 gh cli로 하게 된다.현재 깃헙 패키지 레지스트리 관련 관리 명령어가 구현되어 있지 않다.#3854 스크립팅으로 레지스트리를 관리하려면(hard purge 등)
$ gh api
로 패키지 관리 API 엔드포인트를 직접 호출할 수밖에 없다.GitHub API에는 구현되어 있으나 gh 내장 명령어 자체로는 구현되지 않은 기능들이 다수 있다. 이 경우 관련 확장을 찾아보고, 있다면 해당 확장을 설치하여 해결할 수 있다.
5. 확장
*은 공식 확장(cli/
organization 하위)을 말한다.- gh-webhook*: 웹훅 관리 확장.
- dlvhdr/gh-dash: TUI 대시보드 확장. golang에서 자주 쓰이는 charm 엔진을 사용한다.
- seachicken/gh-poi: 머지된 브랜치 tidy 확장.
- rnorth/gh-combine-prs: 동시에 열린 상태인 복수 개의 PR을 병합해 하나의 PR로 재병합하는 확장. 기본적으로 내부적으로 임시 브랜치 하나에 나머지 모든 브랜치를 3way-merge하고 이를 가장 최신 새 PR로 새로 여는 방식으로, suqash나 리베이스가 아니다.
- mislav/gh-cp: scp와 비슷하게 깃헙 리모트에서 로컬로 개별 파일을 복사하는 명령어.
- jrnxf/gh-eco: TUI 프로필 대시보드.
- heaths/gh-label: 이슈 라벨 관리 확장.
- meiji163/gh-notify: GitHub 알림 인박스 확인 TUI.
- redraw/gh-install: release에 포함된 아티팩트 또는 빌드 결과물을 바로 설치할 수 있게 하는 확장.
- Link-/gh-token: PAT 또는 레거시 토큰 발급이 아니라, 사전 등록된 GitHub App을 통한 OAuth 인증으로 토큰을 일회성 발급할 수 있는 확장.
- mislav/gh-contrib: 흔히 잔디라 불리는 기여 빈도 그래프를 터미널에서 보여주는 확장.
- k1LoW/gh-grep: 클론하지 않은 저장소 파일을 대상으로 grep을 수행하는 확장.
- matt-bartel/gh-clone-org: 특정 organization에 속한 모든 저장소를 클론하는 스크립트.