Visual Studio のソリューション エクスプローラーで「Analyzers」や一部のファイル/フォルダーに “⛔ ignored” 風のアイコンが付き、Git に追加できない——そんな現象を一度でも踏んだことがあるなら、本記事が役に立ちます。アイコンの正体から、無視ルールの特定・解除、再登録のベストプラクティスまで、現場で迷わないための具体手順を丁寧に解説します。
Visual Studio の Analyzer に付く “ignored” アイコンの意味と解除方法
現象の整理
- ソリューション エクスプローラー上で Analyzer(または任意のファイル/フォルダー)に「無視(ignored)」を示すアイコンが付く。
.gitignoreに Analyzer 名は書かれていないのに Git に追加できない/変更が検出されない。- Visual Studio から「ソース管理に追加」を実行しても反映されないことがある。
結論から言うと、このアイコンは Visual Studio が Git の「無視(ignore)」状態を分かりやすく可視化しているだけです。したがって対処は Git 側の設定を見直すのが正道です。
“ignored” の正体:Git の無視状態を示すアイコン
Visual Studio は Git リポジトリの状態(未追跡、変更あり、無視など)をアイコンのオーバーレイで表示します。「ignored」アイコンは、当該パスが何らかの無視ルールにマッチしていることを示します。対象は以下のいずれか(または複数)です。
<repo>/.gitignore(リポジトリ単位の無視設定)<repo>/.git/info/exclude(ローカル専用の無視設定)- グローバル GitIgnore(例:
%USERPROFILE%\.config\git\ignoreなど、環境ごと)
Analyzer の実体は多くの場合 bin/ や obj/、packages/、.nuget/ キャッシュ配下の .dll です。bin/ や obj/、*.dll といった広いパターンにより、意図せず巻き込まれて無視されることがよくあります。
まずは原因の特定:どのルールに当たっているかを調べる
闇雲に .gitignore をいじる前に、根拠を持って無視ルールの出処を突き止めます。最短の道具はこれです。
git check-ignore -v <ファイルまたはフォルダーの相対パス>
-v を付けることで、どのファイルのどの行がヒットしたかが表示されます。たとえば次のような出力なら、.gitignore の該当行が原因だと明確に分かります。
.gitignore:12:bin/ bin/AnalyzerRules/MyAnalyzer.dll
もし何も出てこない場合は、.git/info/exclude やグローバル GitIgnore が犯人の可能性が高いです。グローバル設定ファイルの場所は以下で確認できます。
git config --get core.excludesFile
よくある「巻き込み」パターン一覧
| 無視パターン | 巻き込まれがちな対象 | 典型的な症状 | 典型的な対処 |
|---|---|---|---|
bin/、obj/ | ビルド成果物配下の Analyzer DLL、生成コード | Analyzer ノードや bin/**/MyAnalyzer.dll が ignored | 追跡したいものを bin/ の外へ移す/否定パターンで例外化 |
*.dll | 手元の tools/ 配下のユーティリティ DLL、Analyzer | tools/*.dll がすべて ignored | !tools/analyzers/MyAnalyzer.dll を追加 |
/* や * の広すぎるワイルドカード | 意図せず広範囲 | 新規で追加したディレクトリが丸ごと ignored | 粒度の細かいパターンに見直す |
packages/、.nuget/ | ローカル配布の Analyzer を誤って配置 | packages/MyAnalyzer/** が ignored | リポジトリ内の tools/analyzers/ など追跡用フォルダーへ移動 |
対処の全体像(結論先取り)
| 課題 | 解決策 |
|---|---|
| アイコンの意味が分からない | Visual Studio が表示する Git の無視状態であり、.gitignore/.git/info/exclude/グローバル GitIgnore によってマッチしています。 |
| どのルールで無視されているか分からない | git check-ignore -v <パス> を実行。広いパターン(bin/、obj/、*.dll など)に巻き込まれていないか確認。必要に応じて否定パターン ! を追加。 |
| .gitignore を直してもアイコンが消えない | インデックスの状態を整理。git rm --cached <対象> → git add <対象>。Visual Studio なら右クリック → Git → ソース管理に追加。 |
| .gitignore に該当行が見当たらない | .git/info/exclude とグローバル GitIgnore を確認。ビルド生成物は基本的に追跡しない方針も検討。 |
| そもそも追跡するべきか迷う | Analyzer DLL や生成コードは原則コミット不要(ビルドで再現可能)。ただし CI 短縮や配布要件があれば追跡対象とする合理性あり。 |
手順サマリー(最短ルート)
- 無視理由を特定:
git check-ignore -v <パス>。 - .gitignore を修正:広すぎるワイルドカードを外す/否定パターン
!を追加。 - インデックスを更新:
git rm --cached <対象>→git add <対象>(必要ならgit add -f)。 - コミット:プッシュ前に差分を確認し、意図どおりに追跡されることを確認。
否定パターンの正しい書き方(親ディレクトリが無視されている場合)
.gitignore では、親ディレクトリが無視されていると、その配下の個別ファイルに ! を書いただけでは有効にならないことがあります。再包含(re-include)したいときは、ディレクトリ階層ごとで例外を明示しましょう。
# 既存(広い)無視
bin/
# "bin/AnalyzerRules" 配下だけ追跡したい
!bin/
bin/*
!bin/AnalyzerRules/
bin/AnalyzerRules/*
!bin/AnalyzerRules/MyAnalyzer.dll
このように段階的に「!」で戻すことで、親の無視をくぐり抜けられます。もっとも、無視対象(bin/)の配下に「追跡したい成果物」を置く設計自体が衝突の元です。おすすめは、追跡したい Analyzer を tools/analyzers/ のような専用ディレクトリへ移すことです。
Analyzer を確実に追跡・共有する構成(推奨)
プロジェクトで独自の Analyzer DLL を配布・固定したい場合、以下の方針が実務上シンプルで堅牢です。
- リポジトリ管理下の専用フォルダーを作る(例:
tools/analyzers/)。 - Analyzer DLL をそこに配置し、
.gitignoreで当該パスを無視しない(必要なら否定パターンを追加)。 .csprojに明示的に Analyzer を参照する。
<ItemGroup>
<Analyzer Include="tools\analyzers\MyAnalyzer.dll" />
</ItemGroup>
NuGet で配布されているアナライザーを使う場合は、PackageReference を使ってプロジェクトに含めるのが簡潔です。設定はおおむね次のイメージになります(バージョンは適宜固定)。
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="X.Y.Z" PrivateAssets="all" />
</ItemGroup>
PrivateAssets="all" を付けることで、下流プロジェクトへ伝播せず、ビルド時のアナライザーとしてのみ機能します。これなら物理 DLL を直接コミットする必要はありません。
「.gitignore を直したのにアイコンが消えない」を解消する
無視ルールを修正しても Visual Studio の表示が追いつかない/Git の追跡状態が変わらない場合、インデックス(ステージ)を整理します。
# いったんインデックスから外す(ファイルは残る)
git rm --cached <対象パス>
# 改めて追跡に追加
git add <対象パス>
# 既存の無視ルールを越えて強制的に追加したい場合
git add -f <対象パス>
# 確認してコミット
git commit -m "Track analyzer DLL again"
Visual Studio から操作するなら、対象を右クリック → Git → ソース管理に追加 → 変更をコミット、で OK です。
「.gitignore に該当がない」場合に確認する2つの場所
.git/info/exclude:リポジトリローカルの除外ファイル。共有されず、該当していると気付きにくい。- グローバル GitIgnore:環境ごとに設定される無視ファイル。場所は
git config --get core.excludesFileで確認可能。
チームで再現しない「自分だけ ignored」問題は、ほぼこの2か所が原因です。
それでも迷ったら:決め方の指針(追跡すべきか?)
| 対象 | 通常の方針 | 追跡する合理的な例外 |
|---|---|---|
| Analyzer DLL(自作) | 専用フォルダーに置いて追跡 or NuGet 化 | 社内配布物で CI を軽量化したい/配布のサプライチェーンを極力シンプルにしたい |
生成コード(obj/ 配下) | 非追跡(ビルドで再生成) | 生成器が閉じられていて再生成不能/配布物の一部として固定したい |
ビルド成果物(bin/ 配下) | 非追跡 | アーティファクトとして配布・検収が必要(※通常はパッケージ管理やリリースで対応) |
ケース別ハンズオン
ケースA:bin/ の下に Analyzer を置いたら ignored になった
git check-ignore -v bin/AnalyzerRules/MyAnalyzer.dllを実行。- 出力が
.gitignore:bin/なら、bin/が原因。 - 推奨:
tools/analyzers/に DLL を移動し、.csprojの参照を更新。 - やむを得ず bin/ 配下を追跡する: 否定パターンで段階的に再包含(前掲サンプル)し、
git add -fで追加。
ケースB:*.dll の無視に巻き込まれた
.gitignoreから*.dllを削除するか、対象 DLL の例外を追加。
# 広すぎる無視
*.dll
# 例外(追跡したい)
!tools/analyzers/MyAnalyzer.dll
複数 DLL を追跡するなら、tools/analyzers/*.dll を 「追跡する側」として明示する構成が分かりやすいです。
ケースC:.gitignore を直したのに VS のアイコンが戻らない
- まず Visual Studio の「Git 変更」ウィンドウで更新を確認。
- 反映されなければ
git rm --cached <対象>→git addでインデックスを整理。 - それでもダメなら Visual Studio を再起動し、
git statusの出力と見比べて差異を潰す。
ワンポイント:git add -f を使うときの注意
git add -f は無視ルールを一時的に無視して強制追加します。ファイルが一度コミットされれば、以後は .gitignore に同じパターンが残っていても 追跡は継続します。しかし、clone した他メンバーの環境で混乱を招かないよう、例外ルール(!)を .gitignore に残しておくのがチーム開発のベストプラクティスです。
トラブルを未然に防ぐチェックリスト
- 追跡したい静的資産(Analyzer、テンプレート等)は
bin/やobj/の外に置く。 .gitignoreに「広すぎる」パターン(*、/*、*.dllなど)を安易に入れない。用途別のサブパスで限定する。- 例外は ディレクトリ階層ごとに戻す。親が無視されている場合は
!を段階的に記述。 - 個人の都合で設定したグローバル GitIgnore は、チームが把握できるよう README や規約に明記。
- Visual Studio の「アイコン表示」を活用して、無視の過剰適用を早期に検知する。
サンプル:最小で分かりやすい .gitignore
以下は「ビルド成果物は無視しつつ、リポジトリ管理の Analyzer だけは追跡する」最小構成の一例です。
# ビルド生成物
bin/
obj/
artifacts/
# ユーザーごとの設定
.vs/
*.user
*.userosscache
*.suo
# ログ・一時
*.log
*.tmp
# 例外:リポジトリ管理の Analyzer は追跡
!tools/
tools/*
!tools/analyzers/
tools/analyzers/*
!tools/analyzers/MyAnalyzer.dll
Analyzer の参照方法をプロジェクト標準に落とし込む
複数プロジェクトで同じ Analyzer を使うなら、Directory.Build.props に定義するとメンテが楽になります。
<Project>
<ItemGroup>
<Analyzer Include="$(MSBuildThisFileDirectory)tools\analyzers\MyAnalyzer.dll" />
</ItemGroup>
</Project>
これでリポジトリ直下の tools/analyzers に置いた DLL を全プロジェクトで共有できます。
生成先をずらして競合を避ける(設計で解決)
ビルドやコード生成で Analyzer DLL や生成物が作られる場合、生成先を bin/・obj/ から分離しておくと無視ルールとの衝突が減ります。SDK スタイルのプロジェクトでは、MSBuild のプロパティでコピー先を変更できます。
<PropertyGroup>
<AnalyzerCopyDir>$(MSBuildProjectDirectory)\artifacts\analyzers</AnalyzerCopyDir>
</PropertyGroup>
リポジトリ管理する必要がある資産は artifacts/ ではなく tools/ へ、生成物は artifacts/ へ——と役割を分けると運用が安定します。
よくある質問(FAQ)
Q1. Visual Studio で「無視」アイコンがあるのに、コマンドラインだと git status に出てくるのはなぜ?
A. Visual Studio の表示が遅延しているか、インデックスが不整合の可能性。git check-ignore -v の結果を信頼し、必要なら VS を再起動、git rm --cached → git add で整えます。
Q2. 強制追加(git add -f)と .gitignore の例外、どちらが良い?
A. 強制追加は手早いですが、後から見た人に理由が伝わりません。例外ルールを残すのがチームフレンドリーです。
Q3. Analyzer は NuGet にすべき? DLL をコミットすべき?
A. どちらも一長一短。標準化・更新性なら NuGet、規約やライセンスの都合で配布できないなら DLL をコミット。いずれも「置き場所(bin/ の外)」と「参照方法(Analyzer Include=... か PackageReference)」を チームで統一しましょう。
Q4. グローバル GitIgnore の場所が分からない
A. git config --get core.excludesFile でパスが出ます。チームに影響しない個人設定なので、README にも一言残して混乱を避けましょう。
復旧のフローチャート(保存版)
- ヒット元の特定:
git check-ignore -v <パス>.gitignoreが原因 → 次へ.git/info/exclude/グローバルが原因 → そこを修正
- ルールの修正:広い無視を狭める/
!で再包含/配置場所をtools/へ移す - インデックス再登録:
git rm --cached→git add(必要なら-f) - コミット・プッシュ:差分と CI を確認
実践のヒント:レビューで確認しておきたいポイント
.gitignoreに 例外ルール(!)が適切に記述されているか。- Analyzer の参照が 相対パスで安定しているか(ドライブレター依存やユーザープロファイル依存を排除)。
- CI/ビルドサーバーで
git check-ignoreを使った 静的検査を入れる(無視の過剰適用を検知)。
まとめ
- “ignored” アイコンは Git の無視状態の可視化に過ぎない。
- 原因は 広い無視パターンか、配置場所の設計ミスが大半。
git check-ignore -v→.gitignore修正 → インデックス再登録が王道。- 追跡したい Analyzer は
tools/analyzers/へ移し、Analyzer Include=...か PackageReference で参照。 - チームでルールを共有し、アイコン表示とレビューで早期に逸脱を検知。
付録:コピペで使えるコマンド集(安全運用向け)
# 無視の原因を調査
git check-ignore -v tools/analyzers/MyAnalyzer.dll
# 無視からインデックスへ復帰
git rm --cached tools/analyzers/MyAnalyzer.dll
git add tools/analyzers/MyAnalyzer.dll
git commit -m "Track analyzer DLL under tools/analyzers"
# 強制追加(例外ルールの追加と併用推奨)
git add -f tools/analyzers/MyAnalyzer.dll
# グローバル GitIgnore の場所を確認
git config --get core.excludesFile
付録:失敗しないための小技
- 命名規約:追跡する静的資産は
tools/、生成物はartifacts/、ビルド出力はbin/と役割を分ける。 - 差分監視:Analyzer の更新は
CHANGELOGに残し、バージョン固定で再現性を担保。 - 教育:入社/配属時に
git check-ignore -vの使い方を 5 分だけ共有するだけで、問い合わせが半減します。
最終チェック(公開前に確認)
- “ignored” アイコンが消え、対象ファイルが 追跡済みになっている。
git statusの表示と Visual Studio の表示が一致している。.gitignoreの変更が過不足ない(広すぎない、例外が明示)。- チームの方針(NuGet か DLL 直接コミットか)が README 等に明記されている。

コメント