概要
こんにちは、キュービックでSREをやっているYuhta28です。キュービック内のテック技術について発信します。
皆さんはGit開発する際、ターミナルでgit
コマンド実行後GitHubのサイトを訪れてPRしマージされますでしょうか。そしてマージした後またローカルに戻ってgit pull
でローカルブランチも最新にしていますか🤔
せっかくターミナルで操作しているのに途中でブラウザ操作が入るのは個人的には面倒だと感じています。git push
した後の操作も全てターミナルで完結すればブラウザ切り替えする手間も減らせて煩わしさが減ると思いませんか。
ローカルのリポジトリもバラバラにgit clone
するとあのリポジトリどこだっけ?となり探すのがこれまた面倒になります。
今回GitHub上の操作をターミナルで実現できるGitHub CLIコマンドの紹介とghq、pecoを使った快適なリポジトリ管理を紹介していきます。
GitHub CLIについて
GitHub CLIは2020年にバージョン1系がリリースされ、昨年8月にバージョン2系がリリースされたGitHub操作をターミナル上で実現するためのOSSになります。
GitHub CLIをインストールすることで前述のgit push
以降のGitHub操作をターミナルから操作できるようになりシームレスなGit運用ができるようになります。バージョン2では拡張コマンド機能が追加され、よりカスタマイズされた操作ができるようになりました。(今回拡張コマンドを使うことはないので詳細な說明は割愛いたします)
インストール
概要はこのくらいにして早速インストールしていきます。MacでしたらHomebrewからインストールできます。
brew install gh
その他にも多くのパッケージマネージャ経由でインストールできますので、GitHubのREADMEページをご覧ください。
初期設定
インストールできましたらGitHub CLIの認証を行います。 SSHでGitHubに接続されていましたらローカルのSSH秘密鍵をGitHub CLIに認証させます。HTTPで接続されていましたらトークン値を貼り付けましょう。
gh auth login $ gh auth login ? What account do you want to log into? GitHub.com ? What is your preferred protocol for Git operations? SSH ? Upload your SSH public key to your GitHub account? Skip ? How would you like to authenticate GitHub CLI? Paste an authentication token Tip: you can generate a Personal Access Token here https://github.com/settings/tokens The minimum required scopes are 'repo', 'read:org'. ? Paste your authentication token: ~~~~~~省略~~~~~~
認証が通りましたらGitHubアカウントとしてGitHub CLIが使えるようになります。
$ gh auth status github.com ✓ Logged in to github.com as XXXXXXXXXX (/Users/XXXXXXXXXX/.config/gh/hosts.yml) ✓ Git operations for github.com configured to use ssh protocol. ✓ Token: *******************
Goインストール
このあと紹介するghqもpecoもGo製のOSSなので事前にGoをインストールする必要があります。MacでしたらHomebrewでインストールできますので事前にインストールします。
brew install go
ghqについて
github.com
ghqとはリポジトリ管理を楽にするコマンドラインツールでGo製のOSSです。GitHubのリポジトリをローカルにクローンする場合、git clone
を実行したディレクトリ直下にローカルリポジトリが作成されます。
もし適当なディレクトリにクローンして管理するとどこにローカルリポジトリがあるのか探すのが大変ですし、ローカルにリポジトリをクローンし過ぎるとあっという間にローカルリポジトリの数は膨れ上がります。ghqとこのあと紹介するpecoを組み合わせることで、目的のリポジトリに瞬時に移動できます。
インストール
brew install ghq
pecoについて
github.com
pecoも先述のとおりGo製のOSSです。インタラクティブなgrepツールでghqと組み合わせれば強力なリポジトリ管理ツールになります。
インストール
brew install peco
初期設定
2つをインストールできましたらまずは使用感について試しておきましょう。
ghq get <リモートリポジトリURL>
でGitHubリポジトリをローカルにクローンすることができます。クローン先はデフォルトでは$HOME/ghq
ですが、git config
でクローン先を変更できます。
git config --global ghq.root '~/go/src' #~/go/srcディレクトリ直下にリポジトリを取得
取得したリポジトリはghq list
で一覧化できます。
$ ghq list github.com/aws/aws-health-tools github.com/cuebic/XXXXXXXXXXXXXXXX github.com/iann0036/former2
続いてpecoも試しておきましょう。pecoはパイプで前のコマンドの結果を渡すことで真価を発揮します。
GitHub READMEから引用
エイリアスコマンド作成
ghqとpecoの動作確認が完了しましたらこの2つを組み合わせたワンライナーコマンドを作成し、シェルの読み込みファイルに記載します。
# .zshrc # ghq+peco alias ghcd='cd $(ghq root)/$(ghq list | peco)'
記載しましたらsource
コマンドで読み込みます。
source ~/.zshrc
実行結果
$ ghcd QUERY> github.com/cuebic/XXXXXXXXXXXXXXXX github.com/cuebic/XXXXXXXXXXXXXXXX
ターミナル操作
必要な準備は完了しました。これでどのように変わるでしょうか。
試しに新しいOSSのリポジトリをローカルに落としたい場合は、git clone
からghq get
に変わります。
$ ghq get git@github.com:github/gitignore.git clone ssh://git@github.com/github/gitignore.git -> /Users/ghq/github.com/github/gitignore git clone --recursive ssh://git@github.com/github/gitignore.git /Users/ghq/github.com/github/gitignore Cloning into '/Users/ghq/github.com/github/gitignore'... remote: Enumerating objects: 9730, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (6/6), done. remote: Total 9730 (delta 0), reused 4 (delta 0), pack-reused 9724 Receiving objects: 100% (9730/9730), 2.30 MiB | 2.16 MiB/s, done. Resolving deltas: 100% (5288/5288), done.
ghcd
ですぐにローカルにクローンしたリポジトリに移動できます。
$ ghcd QUERY> github.com/github/gitignore
そして、ローカルリポジトリの編集が完了し、リモートリポジトリにコミットしてマージする場合もターミナル内で全て完結できます。
# リモートリポジトリへのaddからpush作業 $ git add . $ git commit -m "fix" [feature/add-gitops-article 37cb79b] fix 2 files changed, 55 insertions(+), 6 deletions(-) $ git push origin feature/add-gitops-article Enumerating objects: 14, done. Counting objects: 100% (14/14), done. Delta compression using up to 8 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (8/8), 61.15 KiB | 15.29 MiB/s, done. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * [new branch] feature/add-gitops-article -> feature/add-gitops-article # mainブランチへのPRからマージ作業 $ gh pr create Creating pull request for feature/add-gitops-article into main in cuebic/XXXXXXXXXXXX ? Title fix ? Body <Received> ? "What's next? Submit" https://github.com/cuebic/XXXXXXXXXXXX/pull/19 $ gh pr status Relevant pull requests in cuebic/XXXXXXXXXXXX Current branch #19 fix [feature/add-gitops-article] Created by you #19 fix [feature/add-gitops-article] Requesting a code review from you You have no pull requests to review $ gh pr merge ? What merge method would you like to use? Create a merge commit ? Delete the branch locally and on GitHub? Yes #マージ後にローカルブランチを削除するか選択 ? "What's next? Submit" ✓ Merged pull request #20 (feature/add gitops article) remote: Enumerating objects: 2, done. remote: Counting objects: 100% (2/2), done. remote: Compressing objects: 100% (2/2), done. Unpacking objects: 100% (2/2), 1.24 KiB | 633.00 KiB/s, done. remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0 From ssh://github.com/cuebic/XXXXXXXXXXXX * branch main -> FETCH_HEAD 43e72c6..016f5bd main -> origin/main Updating 43e72c6..016f5bd Fast-forward entry/2022/05/17/122008.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 6 deletions(-) ✓ Deleted branch feature/add-gitops-article and switched to branch main #ローカルのブランチを削除
所感
ご覧のようにgit add
からGitHubリポジトリのマージまで全てターミナル上で完結しました。今までは毎回ローカルでgit push
した後にGitHubのサイトを開いて、PRを作成しマージする必要がありました。ターミナルからその操作を全て完結すればストレスフルなGit開発ができると思いますのでみなさんもぜひ試してみてください。