【備忘録】VS CodeのGit操作が重い件を調べたら、直前のGit for Windows更新が怪しかった件

VS CodeのGit関連の動作が遅かったので調べてみた。あまりの遅さにドパガキの自分が耐えられなかったので本腰を入れて調査をしてみた。

VS Codeのソース管理で、git addやdiff表示がもたつき、同期マークも消えなくなりました。ログとコマンドの実測で原因を探し、Defenderの除外追加とGitのダウングレードを試したところ、体感ではよくなった気がします。ただ、対策を同時に2つ入れたので、どちらが効いたのかはまだ分かりません。この記事は、その調査の記録です。

要約

  • 症状が出たのは、最近触ったほぼすべてのプロジェクトです。調べたのは、直近で開いていた Packages/kiritanPages/static-blog です
  • ターミナルの git status は約100msで、Git単体は遅くありませんでした
  • VS Codeのログには、Gitコマンドが41秒止まった記録と、git check-ignore が毎回1-3秒かかる記録が残っていました
  • Git for Windowsを 2.55.0.5 に手動更新したのが2026-09-11で、遅さを感じ始めたのはその後です
  • Defenderの除外追加と Git 2.48.1 へのダウングレードのあと、kiritan のGitコマンドは中央値207msに落ち着きました

NOTE


原因の断定はまだできません。数日使ってみないと、遅さが戻らないかも分からないためです。

症状と環境

遅いと感じた操作は次の3つです。

  • VS Code GUIでの git add
  • 変更のあるファイルを開いてから、diffが表示されるまでの待ち時間
  • 同期マークがずっと回り続ける

環境は、Windows 11、VS Code 1.138.0、Git for Windows 2.55.0.5です。遅さは特定のプロジェクトに限らず、どのプロジェクトでも同じように出ていました。調査では、直近で開いていた D:\Codes\Packages\kiritanD:\Codes\Pages\static-blog を測りました。

調査の記録

Git単体は速かった

まずターミナルから測りました。

対象操作時間
共通git —version80-140ms
kiritangit status110ms
static-bloggit status98ms
static-bloggit diff HEAD, git show HEAD:file80-85ms

どちらも追跡ファイルは200個ちょっとで、小さなリポジトリです。この時点では、Git単体を疑う根拠がなく、VS Code側の不具合を疑っていました(実際に後述する不具合が報告されていたがWindows環境でも同様の不具合があるかは不明)。

巨大ファイルの仮説

static-blog は追跡ファイルが223個なのに、packが1.29GiBもあります。履歴には50MBのPNGや37MBのmp4が残っていました。最初は履歴の重さを疑いましたが、git status が98msで返る以上、日常操作の遅さの主犯とは考えにくいです。ほぼ全プロジェクトで起きているという点とも合いません。この仮説は外しました。

VS Codeのログにあった41秒

VS Codeは拡張機能ごとにログを残していて、Git拡張のログ(Git.log)にコマンドごとの所要時間が出ます。static-blog のログには、次の記録がありました。

  • 2026-09-21 00:18:50 に、git status -z -uallgit show --textconvgit for-each-ref が同時に41秒かかっている
  • git check-ignore が1.0秒、2.1秒、3.2秒と毎回遅い
  • git fetch が3-4分おきに走り、毎回1.2-2.7秒かかっている

41秒の記録は、特定のコマンドが重いというより、その間だけ環境全体が詰まっていた形をしています。同期マークが消えないのは、自動fetchが3分ごとに動いているのが一因だと考えました。node_modules のファイル数は、kiritan で2万2千個余り、static-blog で4万9千個ほどあります。check-ignore の遅さはこれと関係があるかもしれませんが、推測にとどまります。

Rust化との関係

最近GitがRustに置き換わっていると聞いたので、関係を確かめました。git version --build-options を実行すると、rust: disabled と出ました。手元のGitはRustなしでビルドされていて、この線はありません。

既知の不具合報告

GitHubのIssueとQiitaを検索しました。今回の症状にそのまま当てはまるものは見つかりませんでしたが、近い報告が3件ありました。

Git拡張が極端に遅くなる報告です。ターミナルでは1秒未満のfetchが遅くなるとのことで、macOSの報告であり、未解決です。

起動直後の約67秒間、ステージ操作が効かなくなる報告です。WSL環境の報告で、こちらも未解決です。

Git for Windowsの v2.46.1 以降で極端に遅くなり、v2.46.0 以前に戻して解決したという記事です。

Qiitaの記事の版は2.46から2.47系で、今回の2.55とは版が違います。同じ現象かどうかは分かりません。

Gitを更新した時期

Twitterで流れてきたGitの新機能を試したく、最近自分でGitを更新した記憶があったので、インストール日を調べました。レジストリのInstallDateは 2026-09-11 で、版は 2.55.0.5 でした。このPCは2025年2月ごろに買ったもので、それ以来、最近までずっと同じGitを使っていました。手動で更新したのは初めてだったと思います。

遅さを感じ始めたのはこの更新の後で、時期が重なるので、更新を疑うことにしました。

試したこと

自動fetchの間隔を延ばす

git.autofetchPeriod を600秒に設定しました。既定は180秒です。fetch自体は1-3秒で終わりますが、頻度が高いと同期マークが出続けます。

Defenderの除外を追加

リアルタイム保護が git.exe の起動やファイルアクセスを遅くしている可能性がありました。管理者権限のPowerShellで、D:\Codesgit.exe を除外に追加しました。除外リストは一般ユーザーでは読めないので、Defenderのイベントログで確認しています。2026-09-21 00:42:55 に、次の2件の設定変更が記録されていました。

  • Exclusions\Paths\D:\Codes
  • Exclusions\Processes\git.exe

Git 2.48.1 へのダウングレード

Gitは、PCを買った初日に入れてから、今回の更新まで一度も更新していませんでした。そこで、購入時期に近い版として、2025年2月中旬にリリースされた 2.48.1 を選びました。更新前の正確な版は、記録が残っておらず特定できていません。

結果

ダウングレードのあと、kiritan のウィンドウの Git.log を集計しました。01:00から01:10の約10分間で、Gitコマンドは129回でした。

指標
中央値207ms
平均503ms
最大6187ms

普段の git status や git show、git check-ignore は100-300ms程度に収まりました。更新前のログでは check-ignore が1-3秒、git status が41秒かかった記録があったので、比べるとかなり軽いです。

ただし、遅い場面はまだ残っています。

  • 起動直後(01:00:22から01:00:31)は、git fetch が6.2秒、git check-ignore が5.6秒でした。起動時にコマンドが集中するためかもしれません
  • 01:08:32 に、git configgit check-ignore が2.5-2.8秒かかりました。以前の41秒と同じく、複数のコマンドがそろって遅くなっていました

(遅いといっても以前もこの程度だったかもしれませんが)

分かっていないこと

  • どの対策が効いたのか: Defenderの除外(00:42)と、Gitのダウングレード(その後)をほぼ続けて行ったので、効果を切り分けられていません。片方を戻して比べる手はありますが、今は試していません
  • 詰まりの原因: 除外とダウングレードのあとも、01:08:32 に数秒の詰まりが出ました。Gitの版だけでは説明がつきません。当時ビルドなどが動いていたかは、まだ確認していません
  • 観測期間の短さ: 見たのは、約10分間のログ、1つのウィンドウだけです

おわりに

しばらく使ってみないと、遅さが戻らないかは分かりません。戻ったときは、その時刻の Git.log を読めば、何が同時に走っていたかを調べられます。

更新で勝手に新しい版へ戻されるのを避けたいときは、wingetでバージョンを固定できます。

winget pin add --id Git.Git --version 2.48.1

TIP


固定を解除するときは winget pin remove --id Git.Git を実行します。

同じ現象に遭遇した方や原因がわかる方はぜひ教えてください!

連絡先: