20200209のGitに関する記事は8件です。

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_a

GPG 署名をつける

コミットする際、任意のユーザー名とメールアドレスでコミットできてしまう。タグはリリース時に用いられることが多く、偽装されると困ることがある。正当性を保証するために署名がつけることができる(と認識している)。

これに関しては、公開鍵の設定とかしていないので端折る。
完全理解?しらねぇ。

一応、軽く説明すると、

$ 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 という概念を知ったので、今度はこれを勉強して完全理解(笑)できたら記事にしたいと思う。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

練習用リポジトリの作り方

この記事のきっかけ

実務外の勉強内容をアウトプットして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

これでできました
たくさんアウトプットしましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git使うのに便利なCLIツール

背景

日々の業務やらプライベートでのチーム開発で使ってるgit関連のツール紹介です。
gitコマンドは大変便利ですけどそれ以外の周辺ツールを使うことでより便利に使うことができたりします。
(基本的にはmacとlinuxでしか動かしてないですが一部windowsでは使えないものがあります)

スクリーンショット 2020-02-09 14.30.12.png

github/hub

スクリーンショット 2020-02-09 13.38.24.png

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

jonas/tig

ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。

スクリーンショット 2020-02-09 13.43.56.png

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 tig

junegunn/fzf

junegunn/fzf

fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。

下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。

bashrc
fbr() {
  local branches branch
  branches=$(git branch -vv) &&
  branch=$(echo "$branches" | fzf +m) &&
  git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}

同じように以下のように関数を定義すればファイルの差分を表示しつつステージングへ上げると言った操作が簡単に行えたりします。
こう言った情報は公式でもあったりネットに大量にあるのでその辺の入門はとてもしやすくてとても良いです。

bashrc
fga() {
  modified_files=$(git status --short | awk '{print $2}') &&
  selected_files=$(echo "$modified_files" | fzf -m --preview 'git diff {}') &&
  git add $selected_files
}

ちなみに実装はgoです。
他の関数なんかはここにも書いてたりするのでみてみてください。

スクリーンショット 2020-02-09 13.56.33.png

参考記事

インストール

$ brew install fzf

# To install useful key bindings and fuzzy completion:
$ $(brew --prefix)/opt/fzf/install

lazygit

jesseduffield/lazygit

gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。

スクリーンショット 2020-02-09 14.01.08.png

参考記事

その他

こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。

インストール

$ brew install jesseduffield/lazygit/lazygit

(vimプラグイン)vim-fugitive

tpope/vim-fugitive

cliツールではないvim pluginです。
fugitiveはvim用のgitプラグインです。
vimで編集->commitなどの操作をvimを終了させずに行うことができるようになったりします。
blameやdiffもvimを終了させずに使用することが可能です。

スクリーンショット 2020-02-09 20.21.56.png

インストール

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はたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。

tiimgreen/github-cheat-sheet

便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails チュートリアル】一度作成したherokuアプリを作り直すときの復旧手順

はじめに

Ruby on Rails チュートリアル を進めている最中、何らかの理由でherokuアプリを再作成したくなったとき(謎のエラーに苦しんだ時とか)の手順をまとめました

以下、筆者はリモートリポジトリとしてBitbucketではなくGithubを使用していますが、それ以外の開発環境はRails Tutorialに準拠しています。

既存のherokuアプリ名を確認

リモート先に設定しているURLから、アプリ名を確認します。

Console-input
$ git remote -v
Console-result
heroku  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 -v
Console-output
heroku  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 -v
Console-output
heroku  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.rb
Rails.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-result
On 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

おわりに

以上で、完了です!予期せぬエラーが発生して抜け出せなくなった時は、アプリごと作り直すことでエラーが解消されるケースもあります。よければ参考にしてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git使うのに便利なCLIツール

背景

GitHubやらGitLabやら使うのに日々使ってる便利なコマンド紹介

スクリーンショット 2020-02-09 14.30.12.png

github/hub

スクリーンショット 2020-02-09 13.38.24.png

github/hub

お馴染みのやつ。
プルリクエストやカレントディレクトリのgithubページを開いたりすると言った動作をCLIから行えます。
GitHubやGitHub Enterpriseを使ってるなるなら入れておくべきかなって思います。

インストール

$ brew install hub

# aliasを貼ることを公式でも推奨している
(bash/zsh)$ eval "$(hub alias -s)"

(fish)$ eval (hub alias -s)

jonas/tig

jonas/tig

ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。

スクリーンショット 2020-02-09 13.43.56.png

tigの細かい設定はtigrcで行うのが慣習となっているようです。
(コピペして使ってるだけなので詳細はわからないですが。。)

インストール

$ brew install tig

junegunn/fzf

junegunn/fzf

fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。

下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。

bashrc
fbr() {
  local branches branch
  branches=$(git branch -vv) &&
  branch=$(echo "$branches" | fzf +m) &&
  git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}

スクリーンショット 2020-02-09 13.56.33.png

lazygit

jesseduffield/lazygit

gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。

スクリーンショット 2020-02-09 14.01.08.png

こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。

インストール

$ brew install jesseduffield/lazygit/lazygit

(vimプラグイン)vim-fugitive

tpope/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はたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。

tiimgreen/github-cheat-sheet

便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の設定

こちらの記事を参考にさせていただきました :pray:
https://qiita.com/tarumzu/items/87e4d9801d0a413c80f1

https://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: danger

Danger 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 FileList

https://danger.systems/reference.html

各ファイルを取得して変更されたファイルリストを作っていきます。

# gitモジュールから変更されたファイルパスを取得する 
file_paths = git.modified_files + git.added_files

https://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::DiffFile

https://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

削除行にコメントつける方法があれば教えて欲しいです :cry:

PRのコードにインラインコメントをつける

知らなかったんですがDangerを使う際によく使うwarnmessageなどには引数が追加できるようです :fearful:
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

これを実際に実行をしてみてコメントをつけることができました :tada:

スクリーンショット 2020-02-09 11.46.31.png

https://github.com/rnishimu22001/DangerPlayground/pull/2#discussion_r375328482

やりのこしたこと

以下のパターンだとクラッシュしてしまうので変更情報のバリデーションを追加する必要があります。

  • 画像などの形式の違うファイル
  • リネームのみで変更情報しかないファイル

ほかにもgit diffの中身をパースするで記載したパターンだとObjective-Cのクラスメソッドも引っかかったりとたくさん穴がありそうなのでライブラリを使うのが良さそうです。

また、自前で作らなくてもキーワード検知のDanger Pluginは探せばありそうな気がしています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DangerでPRのコード差分にインラインでコメントをつける

概要

GitHub上で「PRの変更内容に特定のキーワードが含まれていたら、変更された箇所にコメントをつける」
というのを調べてやり方がわかったのでメモとして書いていきます。

スクリーンショット 2020-02-09 11.46.31.png

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の設定

こちらの記事を参考にさせていただきました :pray:
https://qiita.com/tarumzu/items/87e4d9801d0a413c80f1

https://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: danger

Danger Pluginを作成する

Danger Pluginとしてclassを作成すればDangerの機能をあまり考ずに使えそうなので今回はDanger Pluginで作成しました。

# code_review.rbのファイル内

module Danger
    class CodeReview < Plugin
        def code_review
            # コードチェックに関する実装を記述...
        end
    end
end

https://github.com/rnishimu22001/DangerPlayground/blob/master/code_review.rb

Dangerfileファイルへの記述はこんな感じです。

# importのパスは適宜変えてください。
danger.import_plugin("./code_review.rb")
code_review.code_review

https://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 FileList

https://danger.systems/reference.html

各ファイルを取得して変更されたファイルリストを作っていきます。

# gitモジュールから変更されたファイルパスを取得する 
file_paths = git.modified_files + git.added_files

https://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::DiffFile

https://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

削除行にコメントつける方法があれば教えて欲しいです :cry:

PRのコードにインラインコメントをつける

知らなかったんですがDangerを使う際によく使うwarnmessageなどには引数が追加できるようです :fearful:
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

これを実際に実行をしてみてコメントをつけることができました :tada:

スクリーンショット 2020-02-09 11.46.31.png

https://github.com/rnishimu22001/DangerPlayground/pull/2#discussion_r375328482

やりのこしたこと

以下のパターンだとクラッシュしてしまうので変更情報のバリデーションを追加する必要があります。

  • 画像などの形式の違うファイル
  • リネームのみで変更情報しかないファイル

ほかにもgit diffの中身をパースするで記載したパターンだとObjective-Cのクラスメソッドも引っかかったりとたくさん穴がありそうなのでライブラリを使うのが良さそうです。

また、自前で作らなくてもキーワード検知のDanger Pluginは探せばありそうな気がしています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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_rsaid_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_hosts

config 設定

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

ついでに

Homebrewtig を入れておくと、git のコミット情報などをコンソール上でグラフィカルに表示してくれます。
source treeKraken などの GUI ツールを入れていないコマンドガチ勢の方でも、作業効率を上げる 1 つとして導入していみては如何でしょうか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む