>From my perspective, this is a bug. If I clone a repo twice like this: git clone https://github.com/user/repo.git ./https git clone git@xxxxxxxxxx:user/repo.git ./ssh And if it contains a .gitmodules like this: [submodule "x"] path = xxx url = ../../different-user/something.git When I `git submodule update --init --recursive` in each, only the HTTPS version works. the SSH version confusingly seems to try to find something at ~/different-user/something.git or some other path in the local file system. this seems consistent with the URL parsing resulting in different segmentation and thus the ../../ ending up in different places: https =[..., 'github.com', 'user', 'repo.git'] ssh=['git@xxxxxxxxxx:user', 'repo.git'] # ../../ https[:-2] -> [..., 'github.com'] ssh[:-2] -> [] This theory is supported by the fact that this works: git clone ssh://git@xxxxxxxxxx/user/repo.git ./ssh cd ssh git submodule update --init --recursive ---- See also: https://stackoverflow.com/questions/36564696/how-to-use-same-protocol-for-git-submodules