厄介な「Filename too long(ファイル名が長すぎます)」という壁
今日、ディレクトリ構造が深くネストされたReactプロジェクトをクローンしようとした際、Windows特有の古典的な問題に直面しました。最初は順調に進んでいましたが、チェックアウトプロセスの途中でGitがエラーを吐いて停止してしまいました。これはGit自体のバグではなく、現代の開発においても依然として私たちを悩ませているWindows APIのレガシーな制限によるものです。
実際に起きたこと
エラーメッセージは次のようなものでした:
error: unable to create file path/to/very/deeply/nested/directory/structure/that/never/seems/to/end/filename.js: Filename too long
fatal: unable to checkout working tree
warning: clone succeeded, but checkout failed.
クローンは「成功」したものの、Gitが実際にファイルをディスクに書き込めなかったため、ワーキングディレクトリは空のままでした。Windowsでは、デフォルトの最大パス長(MAX_PATHとして知られています)は260文字です。これにはドライブレター、コロン、バックスラッシュ、および終端のヌル文字が含まれます。もしC:\Users\Username\Documents\Projects\Company-Internal-Tools\...のようなフォルダで作業している場合、プロジェクトのルートに到達する前ですでに60文字以上を消費していることになります。
デバッグプロセス
解決策を試す前に、次の2点を確認しました:
- パスの長さ: PowerShellコマンドを使用して、失敗したパスが実際にどのくらいの長さかを確認しました。結果は約275文字でした。
- Gitのバージョン: Windows用Gitの最近のバージョン(
git --version)を使用していることを確認しました。古いバージョンではこの問題の処理が不十分なためです。
解決策1:Git固有の修正(最短)
Gitの操作においてこれを解決する最も早い方法は、Gitに対してMAX_PATHの制限を無視するように伝え、内部的なUNC(Universal Naming Convention)プレフィックス(\\?\)を使用して最大32,767文字のパスを扱えるようにすることです。
ターミナル(コマンドプロンプトまたはPowerShell)を管理者権限で実行し、次のコマンドを入力します:
git config --global core.longpaths true
なぜこれで解決するのか: この設定はGitに対して、Windows APIのワイド文字バージョンを使用するように指示します。これにより、260文字の制限を回避できるようになります。グローバルに適用したくない場合は、特定のレポジトリ内で--globalを付けずに実行することも可能ですが、チェックアウトに失敗している場合は通常レポジトリのフォルダに入ることすらできません。
これを実行した後、ファイルを取り戻すためにレポジトリをリセットする必要がありました:
git checkout -f HEAD
解決策2:Windowsで長いパスを有効にする(恒久的な修正)
Gitを修正するだけでは不十分な場合があります。他のツール(VS Code、Node.js、エクスプローラーなど)が依然として長いパスでエラーを起こす可能性があるためです。Windows 10(バージョン1607以降)またはWindows 11では、システム全体で長いパスのサポートを有効にできます。
方法A:レジストリエディターを使用する
Win + Rを押し、regeditと入力してEnterを押します。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemに移動します。LongPathsEnabledという名前の値を探します。- 右クリックして修正を選択し、値のデータを
0から1に変更します。 - コンピュータを再起動します(または、少なくともシェル/ターミナルを再起動してください)。
方法B:グループポリシーを使用する(Windows Pro/Enterprise)
Win + Rを押し、gpedit.mscと入力してEnterを押します。- コンピューターの構成 > 管理用テンプレート > システム > ファイル システム に移動します。
- Win32の長いパスを有効にする を探し、有効 に設定します。
解決策3:「外科的」な回避策
レジストリを編集したりGitを管理者として実行したりできない制限付きの環境にいる場合、「ローテク」な解決策はベースパスを短縮することです。深くネストされたドキュメントフォルダにクローンする代わりに、ドライブのルートにあるフォルダに直接クローンします。
# Instead of this: (これの代わりに:)
# C:\Users\MyUser\Work\Archives\2024\Projects\MyRepo
# Do this: (こちらを実行します:)
C:\> mkdir dev
C:\> cd dev
C:\dev> git clone https://github.com/org/very-long-repo-name.git
プロジェクトのルートを60文字の深さから7文字の深さ(C:\dev\)に移動することで、ネストされたnode_modulesやパッケージ構造に対して53文字分の「余裕」が生まれます。
確認手順
修正が機能したことを確認するために、以下の操作を行いました:
- Git設定の確認:
git config core.longpathsを実行します。trueが返されるはずです。 - チェックアウトの再試行:
git checkout [branch-name]を実行します。「Filename too long」エラーなしで完了すれば成功です。 - ファイルへのアクセス: コードエディタで深くネストされたファイルの1つを開いてみます。編集して保存できれば、OSレベルの長いパスのサポートが機能しています。
学んだ教訓
- Windowsは例外的な存在: LinuxやmacOSでは、デフォルトのパス制限がはるかに高いため(通常は4096文字)、この問題に直面することはほとんどありません。
- プロジェクト構造: この問題を修正できるとはいえ、過度に深いネストは避けるのが一般的なベストプラクティスです。JavaScriptのエコシステムでは
node_modulesが主な原因ですが、pnpmのような現代的なパッケージマネージャーはシンボリックリンクを使用するため、Windows上でのパス長の問題を悪化させることがあります。 - CI/CD: Windowsベースのビルドランナー(GitHub ActionsのWindowsランナーなど)を使用している場合は、パイプラインの失敗を防ぐために、初期化スクリプトに
git config core.longpaths trueのステップを含めるようにしてください。

