見出し画像

GCMを途中で諦めてghコマンドをインストールした

要点まとめ

  • ghインストールはこちらのinstallコマンドを1行ずつ実行する

  • 作成するtokenの必須権限は'repo', 'read:org', 'workflow'

  • gh auth login で認証スタート。

  • 認証中の質問はGitHub.com, HTTPS, Y, Paste an authentication token と答えて最後に作ったtokenをコピペ

  • ghでログイン後にgitコマンドでGitHubと通信できなかったら下記コマンドを実行

gh auth setup-git

きっかけ

ubuntuでgitを使ってて、GitHubのPATを平文保存はなぁ、どうしよう、と思ってはいたものの、調べたけどなんだか難しそうで、まぁ個人PCだし誰も見に来ないだろうと諦めて

git config --global credential.helper store

してました。
久々にgit使おうとしたらPATの期限が切れてたのでいい機会だと思ってトークンどうするのがいいんだろうと思ってまた調べた結果、普通にghコマンドになったというお話。


GCMでやってみたい(諦めた)

 Caching your GitHub credentials in Gitを見ると GitHub CLI (gh)か Git Credential Manager (GCM)の2択のようです。
なんとなくGCMの方が汎用的なこと覚えられそうでいいかな?と思ってこちらの導入を目指しました。
(結果今の自分の知識では手に負えなくて諦めたんですが・・・)
ghをどうやって使えるようにするのかだけ知りたいんだよという方はこの章はスルーしてください。

何で保存する?

curlがインストール済みならExperimental: install from source helper scriptに書いてあるコマンド実行するだけでインストールは問題なく行くかと思います。

curl -LO https://raw.githubusercontent.com/GitCredentialManager/git-credential-manager/main/src/linux/Packaging.Linux/install-from-source.sh &&
sh ./install-from-source.sh &&
git-credential-manager-core configure

問題はここからで、何でcredentialを保存するかを決めないといけないです。
Linuxでつかえるのは以下のようです。

freedesktop.org Secret Service API
GPG/pass compatible files
Git's built-in credential cache
Plaintext files

https://github.com/GitCredentialManager/git-credential-manager/blob/main/docs/credstores.md#credential-stores

このうちPlaintext filesは安全じゃないみたいなので却下。
Git's built-in credential cacheは一時保存されるだけみたいなので却下。
残るはfreedesktop.org Secret Service APIとGPG/pass compatible filesなのですが、ここでSecret Serviceを選択すればおそらく平和的に終わってました。
Secret Serviceを選びたくなかった理由はGUI必須だったため。ubuntuなのでできるんでしょうがCUIだけで完結したいという謎のこだわりのせいで却下しました。

するともう選択肢はGPG/pass compatible filesしかないんですよね。
しかもHeadless/TTY-only sessionsにも当てはまるはず?(よくわかってないけど)。
GPGとはなんぞや?を調べてる途中でこれはすぐには理解できそうにないや、と諦めることにしました!


GitHub CLI(gh)の導入

インストール

もうstoreでいいかなとも思ったのですがせっかくなのでghも試しにやってみることにしました(調べた結果CUIのみでできそうだったので)。
ちなみにGCMインストールしたときに~/.gitconfigにいろいろ追記されちゃってたので一旦コメントアウトして、認証情報もクリアしました。
が、実際にはクリアした気になってただけだったっぽい?です。
(正直credential.helperの動きがよくわかってない。。)
多分~/.gitconfigは下記みたいな感じになってたと思います。
生きてるhelper=のところが自信ないですが多分ここがeraseだと悪さしそう?な気がします。

[user]                                                                                                                      
        name = dumako                                                                                                       
        email = ****@***.com                                                                                       
[credential]                                                                                                                
        helper = erase                                                                                                      
#       helper =                                                                                                            
#       helper = /usr/local/share/gcm-core/git-credential-manager-core                                                      
[credential "https://dev.azure.com"]                                                                                        
        useHttpPath = true                 

Installing gh on Linux and BSDのインストールコマンドは4行一気に貼り付けるのではなく1行ずつやったほうがいいかもしれないです。

curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh

バージョン表示されればインストールは大丈夫かなって。

$ gh --version
gh version 2.9.0 (2022-04-26)
https://github.com/cli/cli/releases/tag/v2.9.0

PATの準備

そんな小難しいことはするつもりがなかったので最低限の権限にしました。最低限とは下記のようです。

The minimum required scopes are 'repo', 'read:org', 'workflow'.

workflowはもしかしたら必須じゃないかもしれないです。コマンドに従って出てきたのは上記なのですが、下記マニュアルには表記がなかったです。

The minimum required scopes for the token are: "repo", "read:org".

https://cli.github.com/manual/gh_auth_login

このことには後で気づいたのでworkflowも付与しちゃいました。

New personal accsess token scopes

ログイン

オプション無しで素直にやりました

$ gh auth login
? What account do you want to log into?  [Use arrows to move, type to filter]
> GitHub.com
  GitHub Enterprise Server

GitHub.comでEnter(この>はカーソルキー↑↓で動かせます)

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations?  [Use arrows to move, type to filter]
> HTTPS
  SSH

HTTPSでEnter

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? (Y/n) Y

Yと打ち込んでEnter

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI?  [Use arrows to move, type to filter]
  Login with a web browser
> Paste an authentication token

Paste an authentication tokenでEnter
(デフォルトはLogin with a web browser)

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? 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', 'workflow'.
? Paste your authentication token: ****************************************

さっき作ったtokenをコピペしてEnter

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? 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', 'workflow'.
? Paste your authentication token: ****************************************
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as dumako

ログインできましたねー。
多分普通にやったらここでおしまいなのでしょうが私はいろいろ試してしまった結果(?)問題がおこりました。


gitコマンドがGitHubと通信できない

ログイン後に試しにfetchしたら認証が走りました。

$ git fetch
git: 'credential-erase' is not a git command. See 'git --help'.
Username for 'https://github.com':

ghの方はちゃんと動いてそうです。

$ gh label list                                                                 
                                                                                                                            
Showing 9 of 9 labels in dumako/c_lang                                                                                      
                                                                                                                            
bug               Something isn't working                     #d73a4a                                                       
documentation     Improvements or additions to documentation  #0075ca                                                       
duplicate         This issue or pull request already exists   #cfd3d7                                                       
enhancement       New feature or request                      #a2eeef                                                       
help wanted       Extra attention is needed                   #008672                                                       
good first issue  Good for newcomers                          #7057ff                                                       
invalid           This doesn't seem right                     #e4e669                                                       
question          Further information is requested            #d876e3                                                       
wontfix           This will not be worked on                  #ffffff 

よくわからないのでstoreにしてみたら認証は走らなくなりました

$ git config --global credential.helper store
$ git fetch
$ 

???
と思ってhomeを確認したらありました、.git-credentials。。

$ ls -a ~/                                                                       
.              .bashrc    .gitconfig              
..             .cache     .gitconfig.bak          
.aws           .config    git-credential-manager  
aws            Desktop    .git-credentials        
.bash_history  Documents  github                  
.bash_logout   Downloads  .gnupg                  

これはいらないはず。rmしました。すると

$ git fetch
Username for 'https://github.com': 

やっぱり認証走りました。ghでログインしてもgitにはその認証引き継がれない?と思ってました。今見返すとログインするときに

Authenticate Git with your GitHub credentials? (Y/n) Y

としてるので正常だったら連携されるのかもしれないですが、少なくとも私はできてない状態でした。
gitと連携させる方法がわからず困りました。
いろいろ見ていった結果たどり着いたのが下記でした。


解決

英語なのでちゃんと何言ってるかはわからないwのですがとりあえずコマンドは用意されているようです。
というわけで下記のコマンドを実行。

$ gh auth setup-git

すると~/.gitconfigが下記のようになりました。
(多分その前にいろいろしててコメントアウトとか[credential "https://dev.azure.com"]のところとかは消してしまってた模様。。)

$ cat ~/.gitconfig
[user]
        name = dumako
        email = ***@***.com
[credential]
        helper = store
[credential "https://github.com"]
        helper = 
        helper = !/usr/bin/gh auth git-credential
[credential "https://gist.github.com"]
        helper = 
        helper = !/usr/bin/gh auth git-credential

helper = storeは残るんですね。(ようわからん)
何はともあれこの状態でもfetchが通ることが確認できました!
めでたしめでたし。

$ cat ~/.git-credentials
cat: /home/dumako/.git-credentials: No such file or directory
$ git fetch
$

感想

  • GPGを理解したい

  • いつかGCM設定リベンジしたい

  • gitconfig理解したい

  • linuxもちゃんと勉強しなきゃ・・・

  • 英語も勉強しなきゃ・・・

うーん、課題だらけ。。
ところでghコマンドはどこにtoken情報をもってるんですかね??


この記事が気に入ったらサポートをしてみませんか?