あらすじ:QA のひとから「これ検証環境にもうマージされてる?」という問い合わせが 100 億万件あった。

先にまとめ

  • git log | grep | sed | sort | uniq > commits.txt
  • ブランチ名が ticket-1234 のようにチケット番号と対応しているものとする
  • git log --oneline main..staging
  • sed -e 's/.*\(ticket-[0-9]\).*/\1/'
  • プロジェクト管理についてはノーコメント

コマンドこうです。

$ git log --oneline main..staging | grep ticket- | sed -e 's/.*\(ticket-[0-9]\+\).*/\1/' | sort | uniq > commits.txt

順にみていきます。

git log でブランチ間の差分を取る

$ git log --oneline main..staging

A..B のようにふたつのドットを指定すると、B にだけあって A にはないコミットだけを表示させることができます。

前詳しく書いたので見てみてください。

加えて --oneline オプションで長いコミットメッセージとかを省略します。

| で次の操作へ渡す

縦棒記号で標準出力をパイプして順次処理してゆきます。

grep でチケット関係のコミットに絞る

$ git log --oneline main..staging | grep ticket-

grep を使ってチケット番号のあるコミットに絞ります。

grep は global RegExp print の意味らしいよ。正規表現を用いて検索できるコマンドです。

今回は仮に ticket-1234 のような命名規則としてますがご利用の際は適宜よろしく変更してください。

sed でチケット番号だけにする

$ git log --oneline main..staging | grep ticket- | sed -e 's/.*\(ticket-[0-9]\+\).*/\1/'

まだ git log の出力形式なので、sed で変換してやります。

sed は stream editor の意味らしいよ。文字列を編集できるコマンドです。基本的には正規表現で、 -e 's/xxx/yyy/' という形で “xxx” を “yyy” へ置換します。自分も詳しくないので man とかみてください。

括弧 \(…\) でキャプチャした部分は \1, \2, \3, … で参照できます。今回は該当箇所以外を全部消すので .* も必要です。あと \d は使えないので [0-9] で代用です。

並び替えて重複除去

$ git log --oneline main..staging | grep ticket- | sed -e 's/.*\(ticket-[0-9]\+\).*/\1/' | sort | uniq

sort と uniq でなんかこう良い感じにします。

ファイルへリダイレクトして出力

量によっては画面に出してもいいんだけど > でファイルへ出力しておきます。

$ git log --oneline main..staging | grep ticket- | sed -e 's/.*\(ticket-[0-9]\+\).*/\1/' | sort | uniq > commits.txt

できたね。

おしまい

よかったね。

ところで sort とか uniq とかって「UNIX コマンド」ですか? シェルのコマンドという表現の方が穏当?