🐡

gitでtoo long unableが起きた時の解消法

2022/05/23に公開

環境

Windows 11

経緯

開発を進めているとDBのテーブル名からクラスの名前を付けることが多いと思います。(e.g. schema.FizzTable -> SchemaFizzRepository, FizzEntity, etc...)
今回もそのルールに従って開発を進め、ファイルをコミットしようとインデックスに追加しようとしたらエラーが出てきてインデックスに追加できませんでした。

ということで、クソ長くなってしまったpathのファイルをインデックスに追加することができれば今回のゴールになります。

エラー例
ファイルを追加するときに次の問題が発生しました: open("{くっそ長いpath}"): Filename too long unable to index file '{くっそ長いpath}'

結果

Filename too long unableはドライブ名からファイル拡張子までのpathの文字数が260文字を超えると発生します。
こちらを解消するには、コマンドプロンプトやPowershell、git bashなどのgitコマンドが使える環境を管理者権限で起動し、以下を流します。

git config --system core.longpaths true

管理者権限で実行している理由は--systemを指定しているから、です。
PC内の全てのgitリポジトリに反映されます。

抵抗がある方は--global--localでより範囲を小さく指定することができます。

コマンド以外ではconfigファイルの[core]longpaths = trueを設定することでも解消できます。

説明

まず、Windowsではpathの文字数が260文字を超えると正しく処理を行ってくれないようです。
gitのインデックスに追加できなかったファイルに対して、コマンドプロンプトからattribコマンドで属性を見ようとしても表示してくれません。
(こちらはWindows10の特定バージョン以降から設定を変更すれば、最長32,767文字まで表示されるようになります。)

これはWindowsのドキュメント[1]にも記載されており、pathは以下のような構成を想定しています。

種別 文字数
ドライブ名(CDなど) 1
:\ 2
ドライブ名以下のファイルpath 256
終了コード(EOFみたいなやつ) 1

合計260文字。これらはMS-DOS時代からの制限となっているようです。[2]

Git for WindowsもWindowsの仕様にならって260文字制限をかけているため、pathが長すぎるとエラーが出てインデックスに追加できない事が起きます。[3]
今では64bitのOSが主流となっているため、260文字制限はデフォルトだと有効となっていますが、設定によって解除することができます。

間違えて設定してしまったconfigはgit config --unset {設定名}のコマンドで削除することができます。
(設定した場所によっては--global--systemのオプションも必要になります。)

感想

gitでインデックスに追加できなかった問題から調査を始めて、Windowsの歴史を少しかじることができました。
今の状態になっているのには何かしらの理由があるはずなので、こういう細かいところから知見を増やしていきたいですね。

参考

Why does the 260 character path length limit exist in Windows? - stack overflow

脚注
  1. Naming Files, Paths, and Namespaces - Microsoft Docs ↩︎

  2. Maximum Path Length Limitation - Microsoft Docs ↩︎

  3. Git cannot create a file or directory with a long path - git-for-windows/git ↩︎

GitHubで編集を提案

Discussion