Skip to content

git コマンドの実行を1回にまとめて高速化する#105

Merged
faithandbrave merged 1 commit into
cpprefjp:masterfrom
Raclamusi:optimize_git_log
Jul 6, 2026
Merged

git コマンドの実行を1回にまとめて高速化する#105
faithandbrave merged 1 commit into
cpprefjp:masterfrom
Raclamusi:optimize_git_log

Conversation

@Raclamusi

Copy link
Copy Markdown
Member

run.py の実行において、ファイルの数だけ実行される git log がボトルネックになっていました。
そこで、1回の git コマンド実行ですべてのコミット情報を出力し、それを解析する方法を提案します。

提案

git log--name-only をつけて実行すると、以下のように各コミットで編集されたファイルの一覧が出力されます。
新しい順に出力されるので、上から見ていって各ファイルが最初に登場するコミットのタイムスタンプおよび著者を調べることで、従来と同じような情報が得られます。

$ git log --date=iso --pretty='format:%at %an' --name-only
1769871600 Author1
path/to/file1.md
path/to/file2.md

1767193200 Author2
path/to/file3.md

実行時間

手元の環境では、 run.py の実行時間が 49.2 秒から 23.7 秒に改善しました。

従来と結果が変わるケース

ファイルごとに git log するのとは結果が変わるケースがあります。

別のブランチで編集し、その編集を取り消し、マージした場合、従来は取り消したコミットは考慮されませんでしたが、提案手法では取り消したコミットの情報を参照します。
次の6つのファイルが該当します。これらは cpprefjp/site#1466 で一度編集した後、元に戻してマージされたファイルです。

  • reference/chrono/duration/op_compare_3way.md
  • reference/chrono/duration/op_unary_minus.md
  • reference/chrono/duration/op_unary_plus.md
  • reference/chrono/time_zone/to_local.md
    • 「2024年06月11日 22時45分38秒 (JST)」→「2025年07月09日 17時29分52秒 (JST)」
  • reference/chrono/gps_clock/from_utc.md
  • reference/chrono/gps_clock/to_utc.md
    • 「2024年11月09日 00時10分22秒 (JST)」→「2025年07月09日 17時29分52秒 (JST)」
    • 「yoh が更新」→「Akira Takahashi が更新」

また、従来はマージコミットの時刻だったが、提案手法ではマージコミット直前の通常のコミットの時刻になるケースがあります。
次のファイルが該当します。これに関しては原因がわかっておらず、そもそもなぜ従来はマージコミットの時刻が参照されていたのかが謎です。

  • reference/atomic/atomic_var_init.md
    • 「2025年07月16日 22時00分01秒 (JST)」→「2025年07月13日 13時07分37秒 (JST)」

@faithandbrave

Copy link
Copy Markdown
Member

なるほど、これでよさそうですね。ありがとうございます。
マージしてデプロイしますね

@faithandbrave faithandbrave merged commit 78ce955 into cpprefjp:master Jul 6, 2026
1 check passed
@faithandbrave

Copy link
Copy Markdown
Member

デプロイしました。
1/3くらい高速化しましたね (GitHub Actionsは下準備に時間がかかる)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants