- 投稿日:2020-02-09T23:34:12+09:00
git の tag コマンドの仕様を完全に理解する
はじめに
git の tag コマンドについて勉強する。
確認に使った git のバージョンは 2.14.2 である。テストに使ったリポジトリ: https://github.com/firedial/git_practice
git tag コマンドについて
git tag には下記の 4 つの使い方がある。
- タグの追加
- タグの削除
- タグの正当性の確認
- タグの確認
タグの追加
基本的な使い方
$ git tag hoge <commit>とすることで <commit> に hoge というタグをつけることができる。
<commit> は省略可能で、省略すると HEAD にタグがつく。また、 <commit> ではなく <object> を使うこともできる。そのためか、すでについているタグで指定することができる(<object> について調べていると奥が深そうだったので深追いはあきらめた...)。
上記で hoge をつけた後に、下記コマンドを実行すると同じところに hogehoge というタグができる。$ git tag hogehoge hoge同じ名前のタグはつけれないので、上記コマンド実行後に、もう一度実行すると怒られる。
$ git tag hoge fatal: tag 'hoge' already exists強制的に別のコミットにつけるには、
$ git tag -f hoge Updated tag 'hoge' (was bf09944)と、 -f (--force) オプションで強制的に付け替えることができる。
元々ついていたコミット(例でいうと bf09944)についていた hoge のタグは消えている。注釈をつける
タグには -a (--annotate) オプションで注釈をつけることができる。
$ git tag -a -m "huga ってなんだろう" huga-m オプションは git commit するときの -m と同じものである。
省略すると外部エディタが開いてそこで記入できる。-m オプションの代わりに -F オプションを使うことができる。
それは、注釈をファイルから読み込むという使い方である。$ git tag -a -F tag.txt annotate_from_fileその場合 -a がなくてもよい。
git tag -F tag.txt annotate_from_file_without_aGPG 署名をつける
コミットする際、任意のユーザー名とメールアドレスでコミットできてしまう。タグはリリース時に用いられることが多く、偽装されると困ることがある。正当性を保証するために署名がつけることができる(と認識している)。
これに関しては、公開鍵の設定とかしていないので端折る。
完全理解?しらねぇ。一応、軽く説明すると、
$ git tag -s hoge$ git tag -u <keyid> hogeで設定できるらしい。
タグの追加のまとめ
man git-tag で出てくるコマンドの書式。
$ git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] <tagname> [<commit> | <object>]上記説明を完全に理解していたら解説するまでもなくわかるだろう。
タグの削除
削除するときは -d オプションで削除したいタグ名を指定する。
$ git tag -d hoge Deleted tag 'hoge' (was 1e98cbf)複数指定してあげることも可能。
$ git tag -d past past_past Deleted tag 'past' (was bf09944) Deleted tag 'past_past' (was bf09944)man git-tag の記述は下記の通り。
git tag -d <tagname>...タグの正当性の確認
さっき端折った GPG の話の続きである。
なのでここも端折る。
やっていることは、署名が正しいかの確認をしているのだろう。かんぜんりかい、なにそれおいしいの?
man git-tag 記述は下記の通り。
git tag -v [--format=<format>] <tagname>...タグの確認
基本的な使い方
$ git tag annotate_from_file annotate_from_file_without_a ano_ano hogehoge huga tag-l オプションをつけてもいい。
$ git tag -l annotate_from_file annotate_from_file_without_a ano_ano hogehoge huga tagカラム表示したいときは --column オプションをつける。
$ git tag -l --column annotate_from_file hogehoge annotate_from_file_without_a huga ano_ano tagむしろカラム表示したくない場合は --no-column オプションをつける。
$ git tag -l --no-column annotate_from_file annotate_from_file_without_a ano_ano hogehoge huga tagある特定のコミットを含むタグ一覧を表示したいときは --contains オプションで検索できる。
$ git tag -l --contains 61f95ae35ab0b6190a24845f07e270fa3c7818a7 annotate_from_file annotate_from_file_without_a ano_ano hogehoge huga tag逆にある特定のコミットを含まない場合の検索は --no-contains オプションでできる。
$ git tag -l --no-contains 4dfdd0f5ea52bac918c26f42e7796f6ce626ebd0 hogehoge huga tagある特定の <object> に対してついているタグを取得するには --points-at オプションを使う。
$ git tag -l --points-at 1e98cbfa0f5763ed79d7ed4fad566e333885ae3d hogehoge huga tag-n オプションを使うことで注釈の1行目を出すことができる。
$ git tag -l -n annotate_from_file ファイルからタグの注釈をつける annotate_from_file_without_a ファイルからタグの注釈をつける ano_ano ファイルからタグの注釈をつける hogehoge 焼肉 huga huga ってなんだろう tag huga ってなんだろう-n を使うと暗黙的に -l がつけられていることになるので省略してよい。
$ git tag -n annotate_from_file ファイルからタグの注釈をつける annotate_from_file_without_a ファイルからタグの注釈をつける ano_ano ファイルからタグの注釈をつける hogehoge 焼肉 huga huga ってなんだろう tag huga ってなんだろう注釈を <num> 行表示したいときは -n<num> みたいに指定する。
$ git tag -n2 annotate_from_file ファイルからタグの注釈をつける annotate_from_file_without_a ファイルからタグの注釈をつける ano_ano ファイルからタグの注釈をつける 複数行 hogehoge 焼肉 huga huga ってなんだろう tag huga ってなんだろう<pattern> で表示するタグを指定できる。下記は a から始まるタグ名を表示。
$ git tag -l a* annotate_from_file annotate_from_file_without_a ano_ano--sort オプションで表示する順番が変えられて、 --[no-]merged オプションでコミットがマージ済みかどうかの指定ができて、 --format は......なんだろうねっ。
完全理解はまだまだ遠い、と思った27の夜。
man git-tag 記述は下記の通り。
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>] [--points-at <object>] [--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>] [--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]tag 名に使えない文字列
ついでに、紹介しておく。
/. が入っていないこと
$ git tag /.a fatal: '/.a' is not a valid tag name.怒られる。
/ や . で終わっていないこと
$ git tag hoge/ fatal: 'hoge/' is not a valid tag name. $ git tag hoge. fatal: 'hoge.' is not a valid tag name.怒られる。
.. が入っていないこと
$ git tag hoge..hoge fatal: 'hoge..hoge' is not a valid tag name.怒られる。
ASCII 制御文字 (0x00-1F,7F) が入っていないこと
水平タブ (^I) を入れた。
$ git tag hoge hoge fatal: Failed to resolve 'hoge' as a valid ref.怒られた。
半角スペースを含む特別な記号 ( ~^:?*[\) が入っていないこと
$ git tag hoge:hoge fatal: 'hoge:hoge' is not a valid tag name.怒られた。
.lock という文字列で終わっていないこと
$ git tag hoge.lock fatal: 'hoge.lock' is not a valid tag name.怒られた。
@{ が入っていないこと
$ git tag hoge@{aaa} fatal: 'hoge@{aaa}' is not a valid tag name.怒られた。
ちなみに @ 自体は問題ない。
$ git tag yakiniku@ $ git tag -l y* yakiniku@怒られたかったのに...。
嘘です。
なぜ tag について解説したのか
何かしらちゃんと調べて記事を書きたいと思っていたところ、これだといい感じの記事の長さになるなぁと思って書いてみた。実際いい長さになったが、想定よりも理解するのに時間がかかって大変だった。
今回、調べている最中に object という概念を知ったので、今度はこれを勉強して完全理解(笑)できたら記事にしたいと思う。
- 投稿日:2020-02-09T21:48:35+09:00
練習用リポジトリの作り方
この記事のきっかけ
実務外の勉強内容をアウトプットしてCTOに見てもらうためgithubに練習用公開リポジトリを作ろうと思い立ちました。
1.ローカルに作業ディレクトリを1つ作成する。(例:practiceディレクトリの中にindex.htmlだけ作る)
2.Github内にローカルと同じ名前のリモートリポジトリを作る
3.ローカルリポジトリとリモートリポジトリを紐付ける
3-1. terminalでルートディリクトリまで移動する(例:cd practice) $ git init これで、practiceという名前のローカルリポジトリができる 3-2. ルートディリクトリにあるものをインデックスに登録 $ git add . 3-3. インデックスに登録されたことをコミットする $ git commit -m "first commit" 3-4. githubのリモートリポジトリのURLをコピーしてくる $ git remote add origin リモートリポジトリのURL 3-5.ローカルリポジトリの内容をリモートリポジトリにpushする $ git push -u origin masterこれでできました
たくさんアウトプットしましょう!
- 投稿日:2020-02-09T20:20:10+09:00
Git使うのに便利なCLIツール
背景
日々の業務やらプライベートでのチーム開発で使ってるgit関連のツール紹介です。
gitコマンドは大変便利ですけどそれ以外の周辺ツールを使うことでより便利に使うことができたりします。
(基本的にはmacとlinuxでしか動かしてないですが一部windowsでは使えないものがあります)github/hub
お馴染みのやつ。
プルリクエストやカレントディレクトリのgithubページを開いたりすると言った動作をCLIから行えます。
GitHubやGitHub Enterpriseを使ってるなるなら入れておくべきかなって思います。
ソースリーディングだけでもgit clone {user}/{repo}
でcloneできたりするのでとても便利。参考記事
インストール
$ brew install hub # aliasを貼ることを公式でも推奨している (bash/zsh)$ eval "$(hub alias -s)" (fish)$ eval (hub alias -s)基本的な使い方なんかは公式も情報が充実してるのでそちらもご覧ください。
jonas/tig
ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。tigの細かい設定はtigrcで行うのが慣習となっているようです。
(コピペして使ってるだけなので詳細はわからないですが。。)tigrc.sample# set key 'g' / goto file top bind generic g move-first-line # set key 'G' / goto file bottom bind generic G move-last-line bind main G move-last-line # set key 'E' bind generic E view-grep # set key 'F' bind generic F ?git fetch %(remote) bind main F ?git fetch %(remote) # set key 'U' bind generic U ?git pull %(remote) # set key 'C' bind generic C !git commit #bind refs C !git commit bind main C !git commit # set key 'P' bind generic P ?git push -u %(remote) %(repo:head)参考記事
インストール
$ brew install tigjunegunn/fzf
fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。
bashrcfbr() { local branches branch branches=$(git branch -vv) && branch=$(echo "$branches" | fzf +m) && git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //") }同じように以下のように関数を定義すればファイルの差分を表示しつつステージングへ上げると言った操作が簡単に行えたりします。
こう言った情報は公式でもあったりネットに大量にあるのでその辺の入門はとてもしやすくてとても良いです。bashrcfga() { modified_files=$(git status --short | awk '{print $2}') && selected_files=$(echo "$modified_files" | fzf -m --preview 'git diff {}') && git add $selected_files }ちなみに実装はgoです。
他の関数なんかはここにも書いてたりするのでみてみてください。参考記事
インストール
$ brew install fzf # To install useful key bindings and fuzzy completion: $ $(brew --prefix)/opt/fzf/installlazygit
gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。参考記事
その他
こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。
インストール
$ brew install jesseduffield/lazygit/lazygit(vimプラグイン)vim-fugitive
cliツールではないvim pluginです。
fugitiveはvim用のgitプラグインです。
vimで編集->commitなどの操作をvimを終了させずに行うことができるようになったりします。
blameやdiffもvimを終了させずに使用することが可能です。インストール
vim pluginマネージャを使用してる場合は以下のように設定してます。
[[plugins]]↲ repo = 'tpope/vim-fugitive'↲keybindは個人的には以下のように設定して使ってます。
vimrc" ========================↲ " airblade/vim-gitgutter↲ " ========================↲ nnoremap [gitgutter] <Nop>↲ nmap <C-h> [gitgutter]↲ nmap [gitgutter]j <Plug>GitGutterNextHunk nmap [gitgutter]k <Plug>GitGutterPrevHunk nmap [gitgutter]u <Plug>GitGutterUndoHunkまとめ
gitコマンド、githubはたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。
便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。
- 投稿日:2020-02-09T15:31:11+09:00
【Ruby on Rails チュートリアル】一度作成したherokuアプリを作り直すときの復旧手順
はじめに
Ruby on Rails チュートリアル を進めている最中、何らかの理由でherokuアプリを再作成したくなったとき(謎のエラーに苦しんだ時とか)の手順をまとめました
以下、筆者はリモートリポジトリとしてBitbucketではなくGithubを使用していますが、それ以外の開発環境はRails Tutorialに準拠しています。
既存のherokuアプリ名を確認
リモート先に設定しているURLから、アプリ名を確認します。
Console-input$ git remote -vConsole-resultheroku ssh://git@heroku.com/<アプリ名>.git (fetch) heroku ssh://git@heroku.com/<アプリ名>.git (push) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (push)リモートリポジトリとしてBitbucketを使用している人は、ここの表記が少し異なります。また、リモートの設定次第では、各URLの先頭が「https:~」で始まる人もいると思います。
いずれにせよ、heroku のリモート先に設定されているURL(上2行)のうち、「.git」の直前の文字列が<アプリ名>になりますので、これをコピーして控えておきましょう
既存のherokuアプリを削除
herokuの無料枠では、5つまでアプリをデプロイすることができます。
しかし、デプロイ枠が余っている場合でも、デプロイ先が複数存在してしまうことは初学者にとって思わぬ形での混乱を招きかねません。
そのため、既存のアプリは一旦消してしまうことをオススメします(余りの無料枠で新規作成する場合は、本章はスキップして頂いて構いません)
Console-input$ heroku apps:destroy --app <アプリ名>Console-result▸ WARNING: This will delete ⬢ <アプリ名> including all add-ons. ▸ To proceed, type <アプリ名> or re-run this command with --confirm <アプリ名><アプリ名>の箇所を、先ほどコピーしたアプリ名をに書き換えてください。
その後、上記のように「本当に消して良いですか?本当に消すなら、アプリ名をもう一回入力してね」という旨のメッセージがきますので、Consoleに<アプリ名>を再入力します
Console-input> <アプリ名>これで、一度デプロイしたherokuアプリを消せました。
新規herokuアプリの作成
Console-input$ heroku createここでアプリ名を指定することもできますが、デフォルトだとheroku側で空いているアプリ名を自動で生成してくれます。
console画面から、「https://git.heroku.com/<新規アプリ名>.git」をと書かれている箇所を見つけ、コピーして控えておきましょう
リモート先の再設定
旧アプリ自体は既に削除済みですが、gitのリモート先が旧アプリのURLのままなので、新アプリのURLに変更します。
Console-input$ git remote remove heroku $ git remote set-url heroku https://git.heroku.com/<新規アプリ名>.gitこれで、リモート先の再設定ができました。念のため確認しておきましょう
Console-input$ git remote -vConsole-outputheroku https://git.heroku.com/<新規アプリ名>.git (fetch) heroku https://git.heroku.com/<新規アプリ名>.git (push) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (push)herokuのリモート先のURLが、新規アプリ名のものになっていれば、OKです。
※任意ですが、リモートリポジトリにgithubを選択肢しており、herokuへのアクセスをHTTPS経由ではなくSSH経由にしたい場合は、リモート先の設定を下記のように描いてください
Console-input$ git remote set-url heroku ssh://git@heroku.com/<新規アプリ名>.git確認すると、
Console-input$ git remote -vConsole-outputheroku https://git.heroku.com/<新規アプリ名>.git (fetch) heroku https://git.heroku.com/<新規アプリ名>.git (push) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch) origin git@github.com:<ユーザー名>/<リポジトリ名>.git (push)これでSSH経由のURLになりました
本番環境でのメール設定
「第11章 アカウントの有効化」で「11.4 本番環境でのメール送信 」まで進んでいる人は、SendGridの再設定が必要です(第11章まで進んでいない人はスキップ)
まずは、SendGridのアドオンを再インストールします。
Console-input$ heroku addons:create sendgrid:starterその後、本番環境の設定ファイル内の「host = ~」の箇所が旧アプリのホストのままになっているので、修正します。
config/environments/production.rbRails.application.configure do . . . config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp host = '<新規アプリ名>.herokuapp.com' config.action_mailer.default_url_options = { host: host } ActionMailer::Base.smtp_settings = { :address => 'smtp.sendgrid.net', :port => '587', :authentication => :plain, :user_name => ENV['SENDGRID_USERNAME'], :password => ENV['SENDGRID_PASSWORD'], :domain => 'heroku.com', :enable_starttls_auto => true } . . . end最後に、heroku config内部における、SendGridのユーザー名とパスワードを更新して完了です。
Console-input$ heroku config:get SENDGRID_USERNAME $ heroku config:get SENDGRID_PASSWORD本番環境での画像アップロード
「第13章 ユーザーのマイクロポスト」内の、「13.4.4 本番環境での画像アップロード
」まで進めていた人は、heroku configにおけるS3に関する情報の再設定が必要です(第13章まで進んでいない人はスキップ)Console-input$ heroku config:set S3_ACCESS_KEY="Accessキーを入力" $ heroku config:set S3_SECRET_KEY="Secretキーを入力" $ heroku config:set S3_BUCKET="Bucketの名前を入力" $ heroku config:set S3_REGION="Regionの名前を入力"各パラメータ値を忘れてしまった場合は、【Railsチュートリアル】S3に画像をアップロードする設定【13章課題】を参考に、AWSコンソールより取得してください。
デプロイ
最後、新規URLへデプロイをして完了です。
Console-input$ rails test $ git add -A $ git commit -m "Recreate heroku app"まだ第11章まで進んでいなかった人は、今回の一連の作業の中でファイルを一切編集していないはずです。
そのため下記のように「ファイルの変更がないため、commitしません」と言う表示が出るかもしれません。
Console-resultOn branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working tree cleanこの場合は、そのまま下へ進んでください。
Console-input$ git push $ git push heroku「第6章 ユーザーのモデルを作成する」まで進めている人は、heroku上でのmigrationも走らせておきましょう
Console-input$ heroku run rails db:migrate加えて、「第10章 ユーザーの更新・表示・削除」まで進めている人は、忘れずにseedファイルを本番環境に流し込んでおきましょう
Console-input$ heroku run rails db:seed $ heroku restartおわりに
以上で、完了です!予期せぬエラーが発生して抜け出せなくなった時は、アプリごと作り直すことでエラーが解消されるケースもあります。よければ参考にしてください。
- 投稿日:2020-02-09T14:16:57+09:00
Git使うのに便利なCLIツール
背景
GitHubやらGitLabやら使うのに日々使ってる便利なコマンド紹介
github/hub
お馴染みのやつ。
プルリクエストやカレントディレクトリのgithubページを開いたりすると言った動作をCLIから行えます。
GitHubやGitHub Enterpriseを使ってるなるなら入れておくべきかなって思います。インストール
$ brew install hub # aliasを貼ることを公式でも推奨している (bash/zsh)$ eval "$(hub alias -s)" (fish)$ eval (hub alias -s)jonas/tig
ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。tigの細かい設定はtigrcで行うのが慣習となっているようです。
(コピペして使ってるだけなので詳細はわからないですが。。)インストール
$ brew install tigjunegunn/fzf
fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。
bashrcfbr() { local branches branch branches=$(git branch -vv) && branch=$(echo "$branches" | fzf +m) && git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //") }lazygit
gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。
インストール
$ brew install jesseduffield/lazygit/lazygit(vimプラグイン)vim-fugitive
cliツールではないvim pluginです。
fugitiveはvim用のgitプラグインです。
vimで編集->commitなどの操作をvimを終了させずに行うことができるようになったりします。
blameやdiffもvimを終了させずに使用することが可能です。インストール
vim pluginマネージャを使用してる場合は以下のように設定してます。
[[plugins]]↲ repo = 'tpope/vim-fugitive'↲keybindは個人的には以下のように設定して使ってます。
vimrc" ========================↲ " airblade/vim-gitgutter↲ " ========================↲ nnoremap [gitgutter] <Nop>↲ nmap <C-h> [gitgutter]↲ nmap [gitgutter]j <Plug>GitGutterNextHunk nmap [gitgutter]k <Plug>GitGutterPrevHunk nmap [gitgutter]u <Plug>GitGutterUndoHunkまとめ
gitコマンド、githubはたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。
便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。
- 投稿日:2020-02-09T12:01:18+09:00
DangerでPRの差分コードにインラインコメントをつける
概要
GitHub上で「PRの変更内容に特定のキーワードが含まれていたら、変更された箇所にコメントをつける。」というのを調べてやり方がわかったのでメモとして書いていきます。
GitHubActionsやDanger Pluginについて知っている方は「PRのコードにインラインコメントをつける」まで飛ばしてください。
サンプル
Rubyは不慣れなのであまり良いコードではないですが確認サンプルを作ってあります。
リポジトリ: https://github.com/rnishimu22001/DangerPlayground
動作のサンプルPR: https://github.com/rnishimu22001/DangerPlayground/pull/2利用環境
「GitHub.com + GitHubActions + Danger」
DangerはRuby版です。
GitHubActionsの設定
こちらの記事を参考にさせていただきました
![]()
https://qiita.com/tarumzu/items/87e4d9801d0a413c80f1https://github.com/rnishimu22001/DangerPlayground/blob/master/.github/workflows/danger.yml
PRを作成したときにGitHubActionsが実行されるように作っています。
# どのタイミングで実行するか?今回はPRがopenされたときにこのActionを実行させる。 on: pull_request jobs: build: runs-on: ubuntu-latest steps: # Actionsで必要なセットアップをしていく - uses: actions/checkout@v1 - name: Setup Ruby for use with actions uses: actions/setup-ruby@v1.0.0 with: version: '2.6' - name: Install Danger run: | gem install bundler bundle install # Dangerの実行 - name: Run Danger env: # Dangerがコメントするために必要? GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: dangerDanger Pluginを作成する
Danger Pluginとしてclassを作成すればDangerの機能をあまり考ずに使えそうなので今回はDanger Pluginで作成しました。
module Danger class CodeReview < Plugin変更されたファイルパスを取得する
リファレンスによると
git.added_files
などで追加されたファイル、修正されたファイルのパスが取れます。Paths for files that were added during the diff
added_files FileList
Paths for files that were removed during the diff
deleted_files FileList
Paths for files that changed during the diff
modified_files FileListhttps://danger.systems/reference.html
各ファイルを取得して変更されたファイルリストを作っていきます。
# gitモジュールから変更されたファイルパスを取得する file_paths = git.modified_files + git.added_fileshttps://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L10
gitの変更情報を取得する
今回はあくまで動作確認のためなのでコード差分の情報を抜き出す簡易なものを作っていきます。
ライブラリとかあればそっちを使うほうが賢いです。今回はDangerが提供してくれている
diff_for_file
を使って作っていきます。
1ファイルずつのdiffを見れるので制御がしやすいです。Details for a specific file in this diff
diff_for_file Git::Diff::DiffFilehttps://danger.systems/reference.html
git diffの中身をパースする
ファイルの差分情報の
git.diff_for_file(変更のあったファイルパス).patch
を見てみると以下のようになります。diff --git a/hello.rb b/hello.rb index 15aaec7..2e57c3c 100644 --- a/hello.rb +++ b/hello.rb @@ -1 +1,2 @@ -puts "hello world" +# TODO: 後で直す +puts "hello world!!!"余談ですがいつも見てるこの
git diff
のフォーマットはUnified Format
というらしいです。
https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html
行の種類 対応しそうな正規表現 ファイルの変更情報 ^@@ 追加された or 修正された行 ^+ 削除された or 修正前の行 ^- 以上の内容を元に愚直にパースして変更行の情報を抜き出していきます。
https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L26-L65パースをする際に手こずったことですが、
Danger
からPRにコメントをつける場合に削除された行につけれませんでした。
PRで削除された行は行としてカウントされないようなので気をつけてください。https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L50
削除行にコメントつける方法があれば教えて欲しいです
![]()
PRのコードにインラインコメントをつける
知らなかったんですがDangerを使う際によく使う
warn
やmessage
などには引数が追加できるようです![]()
https://github.com/danger/danger/blob/master/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb#L63
file_path
: コメントしたいファイルのパス
line
: コメントを残したい行# 指定したファイルの行にコメントを残す warn("コメントしたいメッセージ", file: "./hogehoge.rb", line: 1)https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L23
これを実際に実行をしてみてコメントをつけることができました
![]()
https://github.com/rnishimu22001/DangerPlayground/pull/2#discussion_r375328482
やりのこしたこと
以下のパターンだとクラッシュしてしまうので変更情報のバリデーションを追加する必要があります。
- 画像などの形式の違うファイル
- リネームのみで変更情報しかないファイル
ほかにもgit diffの中身をパースするで記載したパターンだとObjective-Cのクラスメソッドも引っかかったりとたくさん穴がありそうなのでライブラリを使うのが良さそうです。
また、自前で作らなくてもキーワード検知のDanger Pluginは探せばありそうな気がしています。
- 投稿日:2020-02-09T12:01:18+09:00
DangerでPRのコード差分にインラインでコメントをつける
概要
GitHub上で「PRの変更内容に特定のキーワードが含まれていたら、変更された箇所にコメントをつける」
というのを調べてやり方がわかったのでメモとして書いていきます。GitHubActionsやDanger Pluginについて知っているかたは、
「PRのコードにインラインコメントをつける」まで飛ばしてください。DangerはPullRequestの内容を自動でチェックしてコメントをつけてくれるOSSです。
この記事はDangerのセットアップや基本的な使い方については記載はしていないので、「Dangerについて詳しく知りたい!」というかたは是非ほかのかたの記事を探してみてください。
サンプル
Rubyは不慣れなのであまり良いコードではないですが確認サンプルを作ってあります。
リポジトリ: https://github.com/rnishimu22001/DangerPlayground
動作のサンプルPR: https://github.com/rnishimu22001/DangerPlayground/pull/2利用環境
「GitHub.com + GitHubActions + Danger」
DangerはRuby版です。
GitHubActionsの設定
こちらの記事を参考にさせていただきました
![]()
https://qiita.com/tarumzu/items/87e4d9801d0a413c80f1https://github.com/rnishimu22001/DangerPlayground/blob/master/.github/workflows/danger.yml
PRを作成したときにGitHubActionsが実行されるように作っています。
# どのタイミングで実行するか?今回はPRがopenされたときにこのActionを実行させる。 on: pull_request jobs: build: runs-on: ubuntu-latest steps: # Actionsで必要なセットアップをしていく - uses: actions/checkout@v1 - name: Setup Ruby for use with actions uses: actions/setup-ruby@v1.0.0 with: version: '2.6' - name: Install Danger run: | gem install bundler bundle install # Dangerの実行 - name: Run Danger env: # Dangerがコメントするために必要? GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: dangerDanger Pluginを作成する
Danger Pluginとしてclassを作成すればDangerの機能をあまり考ずに使えそうなので今回はDanger Pluginで作成しました。
# code_review.rbのファイル内 module Danger class CodeReview < Plugin def code_review # コードチェックに関する実装を記述... end end endhttps://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb
Dangerfileファイルへの記述はこんな感じです。
# importのパスは適宜変えてください。 danger.import_plugin("./code_review.rb") code_review.code_reviewhttps://github.com/rnishimu22001/DangerPlayground/blob/master/Dangerfile
変更されたファイルパスを取得する
リファレンスによると
git.added_files
などで追加されたファイル、修正されたファイルのパスが取れます。Paths for files that were added during the diff
added_files FileList
Paths for files that were removed during the diff
deleted_files FileList
Paths for files that changed during the diff
modified_files FileListhttps://danger.systems/reference.html
各ファイルを取得して変更されたファイルリストを作っていきます。
# gitモジュールから変更されたファイルパスを取得する file_paths = git.modified_files + git.added_fileshttps://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L10
gitの変更情報を取得する
今回はあくまで動作確認のためなのでコード差分の情報を抜き出す簡易なものを作っていきます。
ライブラリとかあればそっちを使うほうが賢いです。今回はDangerが提供してくれている
diff_for_file
を使って作っていきます。
1ファイルずつのdiffを見れるので制御がしやすいです。Details for a specific file in this diff
diff_for_file Git::Diff::DiffFilehttps://danger.systems/reference.html
git diffの中身をパースする
ファイルの差分情報の
git.diff_for_file(変更のあったファイルパス).patch
を見てみると以下のようになります。diff --git a/hello.rb b/hello.rb index 15aaec7..2e57c3c 100644 --- a/hello.rb +++ b/hello.rb @@ -1 +1,2 @@ -puts "hello world" +# TODO: 後で直す +puts "hello world!!!"余談ですがいつも見てるこの
git diff
のフォーマットはUnified Format
というらしいです。
https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html
行の種類 対応しそうな正規表現 ファイルの変更情報 ^@@ 追加された or 修正された行 ^+ 削除された or 修正前の行 ^- 以上の内容を元に愚直にパースして変更行の情報を抜き出していきます。
https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L26-L65パースをする際に手こずったことですが、
Danger
からPRにコメントをつける場合に削除された行につけれませんでした。
PRで削除された行は行としてカウントされないようなので気をつけてください。https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L50
削除行にコメントつける方法があれば教えて欲しいです
![]()
PRのコードにインラインコメントをつける
知らなかったんですがDangerを使う際によく使う
warn
やmessage
などには引数が追加できるようです![]()
https://github.com/danger/danger/blob/master/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb#L63
file_path
: コメントしたいファイルのパス
line
: コメントを残したい行# 指定したファイルの行にコメントを残す warn("コメントしたいメッセージ", file: "./hogehoge.rb", line: 1)https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb#L23
これを実際に実行をしてみてコメントをつけることができました
![]()
https://github.com/rnishimu22001/DangerPlayground/pull/2#discussion_r375328482
やりのこしたこと
以下のパターンだとクラッシュしてしまうので変更情報のバリデーションを追加する必要があります。
- 画像などの形式の違うファイル
- リネームのみで変更情報しかないファイル
ほかにもgit diffの中身をパースするで記載したパターンだとObjective-Cのクラスメソッドも引っかかったりとたくさん穴がありそうなのでライブラリを使うのが良さそうです。
また、自前で作らなくてもキーワード検知のDanger Pluginは探せばありそうな気がしています。
- 投稿日:2020-02-09T01:56:35+09:00
Tips : GitHub への SSH 認証での接続方法
認証鍵の作成
ssh
を用いて GitHub へのアクセスを行う際の初期設定です。認証鍵が書かれているファイル名はid_rsa
にしました。
これには理由があり、 git コマンドで参照される鍵のパスがデフォルトでは ~/.ssh/id_rsa らしいからです。
(他のファイル名でも、ssh git
で認証の接続成功の確認自体は取れます。)鍵の生成まで# ssh 関連のファイルなどが置かれている場所に移動 $ cd ~/.ssh # rsa で秘密鍵と公開鍵を生成する $ ssh-keygen -t rsa # 鍵の保存ファイル名を聞かれるので、今回は id_rsa Enter file in which to save the key (/Users/edy-eric/.ssh/id_rsa): id_rsa
id_rsa
とid_rsa.pub
が生成されているのが分かります。 pub がつく方が公開鍵になります。
接続したい先に公開鍵を渡しておくことで認証が行われます。ファイルの確認$ ll total 24 -rw-r--r-- 1 ${user-name} staff 0B 2 9 00:58 config -rw------- 1 ${user-name} staff 1.8K 2 9 00:59 id_rsa -rw-r--r-- 1 ${user-name} staff 407B 2 9 00:59 id_rsa.pub -rw-r--r-- 1 ${user-name} staff 799B 2 9 00:57 known_hostsconfig 設定
config に GitHub への接続設定を書いておきます。これが無いと毎度、
ssh git -i ~/.ssh/id_rsa -l git
などの認証を行うための情報を書いて送らないといけなくなってしまいます。エイリアスから設定情報を参照されるようにすることで
git ${Host}
で楽に認証できます。cofigファイルの設定$ less config # Host : エイリアス # HostName : ホスト名 # User : ユーザ名 # IdentityFile : 秘密鍵のパス # GitHub Host git HostName github.com IdentityFile ~/.ssh/id_rsa User gitついでに
Homebrew
でtig
を入れておくと、git のコミット情報などをコンソール上でグラフィカルに表示してくれます。
source tree
やKraken
などの GUI ツールを入れていないコマンドガチ勢の方でも、作業効率を上げる 1 つとして導入していみては如何でしょうか?