第63回シェル芸勉強会にて、Windows環境でShellGeiDataリポジトリ をチェックアウトできないということが話題になりました。

この記事ではこの問題をどうにかする方法を書きます。

検証した環境

  • OS: Windows 10 Home 22H2 19045.2604
  • ターミナル: cmd.exe(コマンドプロンプト)
  • Gitコマンド: git version 2.39.2.windows.1

チェックアウトできない原因

vol.33/yabai/ ディレクトリ に改行コードのみの名前のヤバいファイルが存在しており、NTFS上でこのファイルを作成できないため。

git clonegit checkout したときのエラーメッセージにもファイル名が出力されていた。

error: invalid path ‘vol.33/yabai/
(改行)
(改行)
(改行)
'

エラー

※よく見るとちゃんと改行まで含めてクォートされている

対応方針

Gitの「git-sparse-checkout」という機能を使い、上記のファイル(vol.33)を無視して checkout する。
(ファイルシステム上どうしようもないため)

対応手順

以下、全てターミナル(cmd.exe)上での操作です。
エクスプローラーやGUIのGitツールで同様の操作をしてもいいと思います。

1. checkout されていない状態の ShellGeiData リポジトリを用意する

1
2
3
4
mkdir ShellGeiData
cd ShellGeiData
git init
git remote add origin https://github.com/ryuichiueda/ShellGeiData.git

2. vol.33(と vol.58)ディレクトリを除外する設定を入れる

1
2
git config core.sparsecheckout true
git sparse-checkout set --no-cone /* !/vol.33/ !/vol.58/

vol.58Git LFSを含んでおり、話がややこしくなるので一緒に除外しています

※インターネットには.git/info/sparse-checkoutを直接編集する例がありますが、Windowsだと改行コードや文字コードで面倒なこともあるためgit sparse-checkoutサブコマンドを使うほうが無難かな~と思います

3. Git の protectNTFS 機能をオフにする

1
git config core.protectNTFS false

※「3.」だけやった場合でも、チェックアウトが許可されるだけでファイルが作成されることはなかったです。(チェックアウト後Deleteの差分が出る)

4. master ブランチのデータを取得する

1
git pull origin master

できました。

checkout成功の図

vol.33 と vol.58 が除外されています。

vol.33 と vol.58 が除外されています。

参考情報