gitでtoo long unableが起きた時の解消法
環境
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は以下のような構成を想定しています。
種別 | 文字数 |
---|---|
ドライブ名(C やD など) |
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
Discussion