症状
git submodule update などにおいて, transport 'file' not allowed が発生して失敗する。
エラーの例
1 2 3 4 5 6 7 8 9 |
$ git submodule update Cloning into 'C:/Users/JaneDoe/Projects/USO800/MainSystem/SpaceWarp'... fatal: transport 'file' not allowed fatal: clone of '//WindowsFileServer/_git/SpaceWarp' into submodule path 'C:/Users/JaneDoe/Projects/USO800/MainSystem/SpaceWarp' failed Failed to clone 'MainSystem/SpaceWarp'. Retry scheduled Cloning into 'C:/Users/JaneDoe/Projects/USO800/MainSystem/SpaceWarp'... fatal: transport 'file' not allowed fatal: clone of '//WindowsFileServer/_git/SpaceWarp' into submodule path 'C:/Users/JaneDoe/Projects/USO800/MainSystem/SpaceWarp' failed Failed to clone 'MainSystem/SpaceWarp' a second time, aborting |
原因
原因の概略
デフォルト設定では fileプロトコル転送 が許可されていないため。
原因の詳細
Windowsファイル共有 や NFS(Network File System) などが fileプロトコル に該当します。fileプロトコルで共有されたgitリポジトリは悪意を持った改竄のリスクがあるため推奨されません。悪意を持った改竄を受けたgitリポジトリからのマルウエア感染を防ぐためにデフォルト設定では禁止されています。
fileプロトコル転送はモジュール本体もサブモジュールもデフォルト設定で禁止されています。モジュール本体のリポジトリは GitHub など公式なサイトに置き、サブモジュールだけをプライベートなローカルの共有サーバに配置するとこのようなことが生じます。
解決策
暫定対策
fileプロトコル転送を(改竄リスクを承知のうえで)許可する。イントラネットに配置されたファイル共有サーバーであれば悪意を持った改竄はないとみなして許可する。
1 |
$ git config --global protocol.file.allow always |
根本対策
(Submoduleを配置している)共有gitリポジトリの転送プロトコルを SSHプロトコル や HTTP/Sプロトコル など、より安全なプロトコルに置き換える。