Gitの小ネタおれおれAdvent Calendar 2022 – 08 日目

会社を買収した新 CEO が急に「過去 30 日分のコードを出せ」とか言ってきても大丈夫。そう、Git ならね。

過去 1 か月分のコードをファイルへ出力する

$ git log --patch --author Ginpei --no-color --since "30 days ago" > my-work.patch

-p, --patch

コードの差分を表示します。

ほら git log だけだとコードは出ませんので。

--author

コミット作者を絞り込みます。例えば --author ginpei で “ginpei”も “Ginpei Takanashi” も “ginginpeipei” も引っかかります。

値は正規表現です。--author g.np.. のようにもできます。ちなみに正規表現の種類もいくつかあって別に --extended-regexp オプションなんかも。

具体的にはコミットログの “Author:” の行が対象です。つまりメールアドレスの方でも絞り込める。

以下 git log --help より。

--author=<pattern>, --committer=<pattern>

Limit the commits output to ones with author/committer header lines that match the specified pattern (regular expression). With more than one --author=<pattern>, commits whose author matches any of the given patterns are chosen (similarly for multiple --committer=<pattern>).

--no-color

コンソール上での着色は不可視の制御文字を利用して実現されているのですが、ファイル出力時には邪魔なので、それをやめて通常の文字のみでの出力にします。

--since

指定の日時以降のコミットのみを対象とします。

リモートリポジトリーではなく記録されたコミットに紐づく日時なので、時差やローカル時刻設定の不備なんかがあると想定通りに動かないかも。(WSL の時刻はよくずれる。)

逆に日時指定の終わりは --until オプションがあります。

"30 days ago"

Git でコミットを指定するとき、人間が読める書式(英語)でも割と理解してくれます。他にも "yesterday" とか "last week" とか。

> my-work.patch

Git ではなくシェルの機能で、画面へ出力する代わりに my-work.patch というファイルに保存します。