はじめに
下記のような人を記事対象者にしています。
- 日常的に、 git & jq コマンドの使用機会が多い
- 能率を上げたい、外部連携APIなどの出力結果から目的の情報を素早く探すなど効率化したいと思っている
git技①: 対象のローカルブランチに素早く切り替える
git branch | grep XXX(※チケット番号を想定、例:1234) | git checkout $(awk '{print $0}')
# ローカルブランチ一覧を表示させる
# チケット番号が含まれるブランチ名をフィルタリング
→ 実践では、"issue/1234"など各プロジェクト規約に沿った命名が決まっていると思うので、そこから使える法則を探し値を設定する
# フィルタリングした行(ブランチ名)をgit checkoutコマンドに渡し実行させる
使える場面
・開発が長期・大規模化するうちにローカルブランチが数十個に増加していて、git branch コマンドからの目視確認で探して切り替える操作が手間。
・ブランチ名にチケット番号や課題番号でも固有の値を含めれば、運用が変わっても流用可能。
git技②: ブランチ間の差分を見て、ファイル単位で比較するコマンド
git diff XXX(※比較元ブランチ名) YYY(※比較先ブランチ名) --name-only | grep ZZZ(※資源置かれているフォルダ /app/resourcesなど)
# XXXとYYYを比較し差分が確認できるファイル名の一覧を表示する
使える場面
・変更をマージする前の差分確認で使える。GUIツール(TortoiseGitなど)を使えない環境下にあればより時短が期待できる。
git技③: Git管理下の全ファイルから特定文字列を含む行を探して出現回数付きで表示する
git grep -n "selectFoodMenu(/" | awk -F'[:]' '{print $NF}' | tr -d ' ' | sort | uniq -c
# これはselectFoodMenuという関数の表示箇所を全ファイルで確認し該当行の内容を取得したら、出現回数付きで表示する例です。
・コメント文に対しても使用できるので、例えば"○○をする"などで調べ、表記ゆれや処理の中身が似ている関数の乱立を発見するのに活用もできる。
・awk や sed などの置換コマンドと併用したコードを検討しているなら、事前調査に向いている
git技④: Gitのstage領域に特定のものだけ追加したい
git add $(find ./menu/ '*meat*json' -print)
# menuフォルダの中のmeatという文字が含まれる全jsonファイル名を抽出し、gitのstage領域に追加する例です。
# ※$(...)は別コマンド実行結果を呼び出し元のコマンドの中に埋め込む記法。
「git add .」のようなGit管理されているファイルの全追加コマンドに対して、こちらは変更はしているけど特定のファイル群しかstage領域に上げたくない場合に活用できます。
jq技①: 連想配列情報から絞込む値や条件に一致する要素をキーバリュー構造のまま取得する
jq '.results[] | select(.code | test("^AB[0-9]{10}"))'
# JSON情報からキー「results」を参照し内部キー「code」値の先頭が
# "AB + 0~9までの数値10桁"であるかを判定して当てはまる要素をキーバリューごと取得する。
この例ですと、code以外にnameやstatusなど他のキーが含まれている場合は、それらも全て含めた状態で返却値が用意されます。
jq技②: 連想配列情報から絞込む値や条件に一致する要素だけをキーバリュー構造のまま取得する
jq '[.results[] | .code | select( test("^AB[0-9]{10}") )]'
# JSON情報からキー「results」を参照し内部キー「code」値のみ全て取得して、
# 先頭が"AB + 0~9までの数値10桁"であるかを判定して当てはまる箇所のキーバリューを取得する。
上記①と似ていますが、この場合はnameやstatusなど他のキーが含まれていても、code値以外は返却結果に含まれません。