[Web Tool] Git Inspector — .git が重い理由と中身を調べる ブラウザ完結型 解析ツール

[Web Tool] Git Inspector — .git が重い理由と中身を調べる ブラウザ完結型 解析ツール

概要

Git Inspectorは、ブラウザの中だけで動く、.git フォルダの中身を調べるツールです。ファイルは、サーバーへ送られません。読むだけで、書き換えも、削除も、しません。

「.git が、なぜこんなに大きいのか」を、自分の目で確かめるために作りました。フォルダをドロップすると、まず 4 つの数字が出ます。その下の表で、大きいものから順に、名前と中身を見られます。ふだんの画面は、それだけで足ります。困ったときは、F1 キーを押すと、使い方が出ます。

  • 開くもの: .git のあるフォルダ(作業フォルダ)、または .git フォルダそのもの
  • 4 つの数字: .git 全体、通常(ブランチ・タグからたどれる)、reflog にだけ、どこからも到達できない。クリックで、下の表が絞られます
  • 大きいもの: 大きい順の一覧。名前(パス)、中身の推定、状態。クリックで、詳しい情報と、先頭のバイトが出ます
  • 履歴: コミットの一覧と、コミットごとの「増えた容量」。どのコミットで重くなったかが分かります
  • pack と参照: pack ごとの大きさと中身、HEAD・ブランチ・タグ・リモートの一覧
  • 読むだけ: 消したり、直したりは、しません

開く

インストールは不要です。下のリンクから、そのまま開けます。

スタートメニューから起動

トップページのスタートメニューからも起動できます。

Git Inspector // スタートメニューから起動

スクリーンショット

大きいもの

上に 4 つの数字、下に大きい順の表が出ます。上の画面では、いちばん上の 2 行が、.git_backup という名前の中の pack ファイルです。

Git Inspector の画面。上に 4 つの数字、下に大きい順のオブジェクトの表。いちばん上の 2 行は、.git_backup の pack ファイル

履歴

コミットごとの「増えた容量」が並びます。「増えた容量の大きい順」にすると、.git を重くしたコミットが、上に来ます。

履歴タブ。コミットの一覧に、そのコミットで増えた容量が並んでいる

名前のないものの中身

どこからも到達できないものには、名前がありません。「中身の推定」の列が、先頭のバイトから、種類を出します。

どこからも到達できないもの 6,902 個の中身の推定が、Rust のコンパイラの出力と判定されている

F1 ヘルプ

F1 キーで、使い方が出ます。

アプリの特徴

  • ファイルは、サーバーへ送られません。書き換えもしません: 読み込みも、解析も、ブラウザの中だけで行います
  • ブランチから見えないものも、数えます: git reset で履歴から消したコミットや、コピーした .git を、うっかりコミットした跡は、ブランチやタグからはたどれず、reflog にだけ残ります。ここを、別の数字として出します
  • どのコミットで重くなったか、分かります: コミットごとに、そのコミットで初めて入ったものの大きさを出します
  • 名前のないものも、中身が分かります: 先頭のバイトから、PNG、zip、glTF、Rust のビルド出力など、30 種類ほどを判定します
  • 検算を、取ってあります: 解析は、git 本体(verify-pack、cat-file、rev-list)と突き合わせました。中身を読んで SHA-1 を計算し直し、名前と一致することも、確かめています
  • 大きな .git でも読めます: pack を、丸ごとは読みません。目次を読んで、必要な所だけを読みます。3.95 GiB の .git で、読み込みは 45 秒でした(WSL の中にあるフォルダ。環境によって変わります)
  • ふだんの画面は、シンプル: 探すときは、F1 です

まず試す

  1. Git Inspectorを開きます。
  2. .git のあるフォルダを、画面にドロップします。.git フォルダそのものでも、かまいません。「フォルダを選ぶ」からも開けます。
  3. 上の 4 つの数字を見ます。「reflog にだけ」や「どこからも到達できない」が大きければ、そこをクリックします。
  4. 下の表の、いちばん上の行をクリックします。下に、大きさ、場所、名前、先頭のバイトが出ます。
  5. 「履歴」タブを開いて、「増えた容量の大きい順」を押します。どのコミットで重くなったかが分かります。

ファイルは、変更されません。

画面の見方

場所内容
上のバー開いたフォルダの名前、読み込みにかかった時間、「別のフォルダを開く」ボタン
4 つの数字.git 全体、通常、reflog にだけ、どこからも到達できない。それぞれ、大きさと個数
タブ「大きいもの」「履歴」「pack」「参照」を切り替えます
表選んだタブの一覧
下の欄選んだ行の、詳しい情報と、先頭のバイト(16 進ダンプ)

上のバーの「読み込み」に、カーソルを少し置いたままにすると、段階ごとの秒数が出ます。

使い方

1. フォルダを開く

画面にドロップするか、「フォルダを選ぶ」で選びます。作業フォルダを開いたときは、中の .git だけを使います(node_modules などは、数えません)。

別のフォルダを調べたいときは、「別のフォルダを開く」を押します。

2. 4 つの数字

数字意味
.git 全体ディスク上の大きさと、オブジェクトの個数
通常HEAD と、ブランチ・タグから、たどれるもの
reflog にだけ上にはなく、reflog(操作の履歴)からならたどれるもの。git reset などで履歴から消したあとに、よく残ります
どこからも到達できないブランチ・タグ・reflog の、どこからもたどれないもの。git add したあとに取り消したファイルなどが、よく残ります

数字をクリックすると、下の表が、その種類だけに絞られます。もう一度押すと、戻ります。

3. 大きいもの

大きい順に、最大 300 件が並びます(「該当 ○○ 件」は、絞った結果の全部の数です)。

列内容
大きさ解凍したあとの大きさ
ディスク上.git の中で、実際に占めている大きさ(圧縮・差分のあと)
種類blob(ファイルの中身)、tree(フォルダ)、commit、tag
中身の推定先頭のバイトから決めた種類(例: glTF、GIF、zip、Git の pack ファイル)
状態通常 / reflog にだけ / 到達できない
名前(パス)tree をたどったときの、最初のパス
場所どの pack の中にあるか(delta は差分の深さ)。ばらのファイルは「ばら」
SHAオブジェクトの SHA(先頭の 8 文字)

上の「検索」に、名前や SHA の先頭を入れると、絞り込めます。

行をクリックすると、下の欄に、SHA、種類、大きさ、ディスク上の大きさ、場所、状態、名前、最初に入ったコミットと、先頭 96 バイトの 16 進ダンプが出ます。「履歴で見る」を押すと、そのコミットが、履歴タブで開きます。

名前が空の行

commit と tree には、名前がありません。blob でも、どこからもたどれないものは、名前が分かりません。そういうものは、「中身の推定」と、先頭のバイトが、手がかりになります。

4. 履歴

コミットの一覧です。

列内容
日時コミットの日時(そのコミット自身のタイムゾーンで表示)
メッセージコミットメッセージの 1 行目
増えた容量(ディスク上)そのコミットで初めて入ったものの、ディスク上の大きさの合計
新しい物そのコミットで初めて入ったものの個数
ブランチ・タグそのコミットに付いている名前
SHAコミットの SHA(先頭の 8 文字)

上のボタンで、「新しい順」と「増えた容量の大きい順」を切り替えます。検索は、メッセージ、SHA、ブランチ名で絞れます(最大 300 行まで表示)。

行をクリックすると、親、作者、状態、全文のメッセージと、そのコミットで入った大きいもの(上位 5 つ)が出ます。クリックすると、「大きいもの」の該当行へ飛びます。

ブランチやタグからはたどれず、reflog にだけ残るコミットには、メッセージの前に「reflog にだけ」の印が付きます。

5. pack

pack ごとの、大きさ、オブジェクトの個数、いちばん大きい中身の一覧です。小さな pack がたくさん積み重なっていないか、巨大な pack が 1 つだけないか、が分かります。

6. 参照

HEAD、ブランチ、タグ、リモートの一覧です。

7. 読み込みの時間

上のバーの「読み込み ○○ 秒」は、フォルダをドロップした瞬間から、表が出るまでの時間です。カーソルを置いたままにすると、段階ごとの内訳が出ます。F12 で開発者ツールの「Console」を見ても、表で出ています。

8. ショートカットキー

キー動作
F1ヘルプを開く / 閉じる
Escヘルプを閉じる

9. 用語

用語意味
オブジェクト.git に入っている 1 つ 1 つ。blob(ファイルの中身)、tree(フォルダ)、commit、tag の 4 種類
packたくさんのオブジェクトを、まとめて圧縮した 1 つのファイル。差分(delta)で、似たものを小さくします
ばらのオブジェクトpack に入っていない、1 つが 1 ファイルのオブジェクト
reflogHEAD やブランチが、どこを指していたかの、操作の履歴
到達できるHEAD、ブランチ、タグから、たどれること
SHAオブジェクトの名前(中身から計算した 40 桁の 16 進数)
git gc使われなくなったオブジェクトを整理するコマンド。作ってから 2 週間(既定)は、消されません

対応していないもの

内容扱い
ファイルの削除・整理(git gc、git prune など)しません。読むだけです
ステージ中(git add 済み)のファイルの判別できません。「どこからも到達できない」に見えます。git status で確認してください
worktree や submodule の .git(フォルダではなく、ファイル)読めません。理由が出ます。本体の .git フォルダを開いてください
枝分かれした履歴での、git と同じ「増えた容量」同じものが 2 つの枝にあると、先に数えた方にだけ付きます。git の数え方とは、違います
ファイルの中身の取り出し・保存できません。名前が分かれば、git show で見られます
枝分かれの図(履歴グラフ)ありません。コミットの一覧だけです
2 GB を超える pack、idx v1コードはありますが、確かめていません
ウィンドウで開いたとき(?embed)確かめていません
スマートフォンでの動作確認していません。専用の設計は、していません
Chrome 以外(Firefox、Safari)での動作確認していません

注意事項

  • 動作の確認は、実機(Windows の Chrome)で、自分のリポジトリを開いて行いました。大きいもの、履歴、pack、参照、中身の推定、読み込みの内訳は、動くことを確認しています
  • 解析の正しさは、git 本体との突き合わせで確かめました。合成したリポジトリ、chalk(1,756 個)、Spoon-Knife、小さな画面確認用のリポジトリの 4 つで、verify-pack、cat-file、rev-list、SHA-1 の再計算が、すべて一致しました
  • 読み込みの時間は、環境によって変わります。自分のブログのリポジトリ(.git 3.95 GiB、26,864 個、WSL の中)で、13 分 15 秒かかっていたものを、読み方を変えて 45 秒にしました。OS のキャッシュが効いている可能性もあります
  • 作業フォルダごとドロップすると、フォルダを受け取る時間が、かかることがあります(自分のブログのリポジトリでは、13.1 秒でした)
  • ばらのオブジェクトは、1 ファイルずつ読むため、多いと時間がかかります
  • 「どこからも到達できない」ものは、git add 済みのファイルのことがあります。消す前に、必ず git status で確認してください。このツールは、何も消しません
  • 「中身の推定」は、先頭の 32 バイトだけの判定です。判定できなければ「不明」になります。大きな差分のものは、「(大きいので未読)」になります
  • パスやコミットメッセージが、そのまま表示されます。画面を、スクリーンショットで公開するときは、ファイル名やメッセージに、見せたくないものが入っていないか、確かめてください
  • 数万コミットを超える履歴や、shallow clone(浅い複製)は、確かめていません
  • フォルダは、ご自身が、読んでよいものを、使ってください。ファイルは、こちらでは、配っていません

よくある質問 (FAQ)

Q. フォルダは、どこかに送信されますか。
A. 送信しません。読み込みも、解析も、ブラウザの中だけで行います。

Q. 開いたリポジトリが、書き換わることはありますか。
A. ありません。読むだけです。削除や整理も、しません。

Q. どのフォルダを開けばいいですか。
A. .git のある作業フォルダでも、.git フォルダそのものでも、かまいません。.git は隠しフォルダなので、見えないときは、作業フォルダをドロップしてください。

Q. 「.git フォルダが見つかりません」と出ます。
A. 開いたフォルダに、.git がありません。作業フォルダか、.git フォルダそのものを開いてください。

Q. 「.git がファイルです」と出ます。
A. worktree や submodule の .git は、本体のフォルダを指す、小さなファイルです。本体の .git フォルダを開いてください。

Q. 読み込みが終わりません。
A. オブジェクトが数万個ある、大きなリポジトリは、時間がかかります。読み込み中に、予想の時間が出ます。数分を超えるときは、一度リロードして、もう一度試してください。ブラウザのフォルダ選択が、node_modules などを数えて遅いときは、ドロップのほうが速いです。

Q. 「reflog にだけ」とは、何ですか。
A. ブランチやタグからはたどれないが、reflog には残っているものです。git reset などで履歴から消したあとや、コピーした .git を、うっかりコミットしたときに、よく残ります。

Q. 「どこからも到達できない」ものは、消してよいですか。
A. このツールでは、判断できません。git add したばかりの、ステージ中のファイルも、ここに見えます。git status で確認してから、ご自身で判断してください。git gc が、作ってから 2 週間(既定)より前のものを、整理することもあります。

Q. 名前(パス)が、空です。
A. commit と tree には、名前がありません。blob でも、どこからもたどれないものは、名前が分かりません。「中身の推定」と、先頭のバイトを見てください。

Q. 「中身の推定」が「不明」です。
A. 先頭の 32 バイトから、判定できなかったものです。3D モデルの頂点データなど、見出しのない生のデータは、判定できないことがあります。

Q. 履歴タブの「増えた容量」が、git の数字と違います。
A. 一直線の履歴では、git の rev-list --objects C --not 親 と、完全に一致します。枝分かれした履歴では、同じものが 2 つの枝にあると、先に数えた方にだけ付くため、違うことがあります。

Q. 履歴に、ブランチにないコミットが出ます。
A. 「reflog にだけ」の印が付いたコミットです。git reset などで、履歴から消したコミットで、まだ消されずに残っています。

Q. 「どのコミットで入ったか」が、出ません。
A. どこからも到達できないものは、コミットからたどれないため、出ません。

Q. 結果は、git のコマンドと同じですか。
A. 解析は、git 本体(verify-pack、cat-file、rev-list)と突き合わせて確かめています。ただし、「一致した」ことは、「正しい」ことの保証ではありません。名前(パス)は、同じ内容が複数の名前を持つとき、git と違う名前を出すことがあります。

Q. 中身を取り出して、保存できますか。
A. できません。名前が分かれば、git show 先頭の SHA で見られます。

関連

Inspector シリーズには、PDF、Office 文書、EXE・DLL、WASM、ソースコードの構文木、フォントを読むツールもあります。

技術記事

実装の詳細は、技術記事にまとめています。

更新履歴

バージョン日付内容
v1.02026/10/21初回公開(4 つの数字、大きいもの、中身の推定、履歴とコミットごとの増えた容量、pack、参照、読み込み時間の内訳、F1 ヘルプ)

クレジット

  • .git の読み込み(pack と idx、差分の組み立て、ばらのオブジェクト、ref と reflog、到達できるかの判定)、履歴の集計、画面は、自作です。外部のライブラリは、使っていません。解凍は、ブラウザ標準の DecompressionStream です
  • 検算には、git 本体を使いました(このツールには、含まれていません)

ご自身で用意したフォルダの権利は、それぞれの権利者にあります。Git Inspectorは、個人の制作物です。