Git submodules and ssh access

GitSshGit Submodules

Git Problem Overview

I have some trouble with a git repository that contains several submodules.

The super git repository was constructed with the commands

mkdir projectname
cd projectname
git init
git submodule add ssh://myusername@server/pathtorepos

When a different user ("otheruser") then clones the super repository everything seems to work out. But when it is time to get access to the submodule

git submodule init
git submodule update

git tries to clone the submodule using "myusername" instead of "otheruser".

How to solve this problem?

Git Solutions

Solution 1 - Git

If possible, it's best to make sure that the .gitmodules file contains a URL for the repository that can be cloned by anyone, typically either a git:// or http:// URL. Then users that have SSH access themselves can change into the submodule after cloning and change the URL in remote.origin.url to point to an SSH URL with their username, e.g.:

 cd my-submodule
 git remote set-url origin otheruser@server:/pathtorepos

The other user should be able to do that even in the current situation. Update: Chris Johnsen points out below that it's also reasonable to use an SSH URL in .gitmodules if you omit the username and all the users of the repository will have SSH access - they'll need to add their username similarly to the above if it differs locally and remotely.

Note that the URLs in .gitmodules are only used when initializing the submodule. Initializing the submodule sets the config value submodule.<SUBMODULE-NAME>.url in the main project to whatever's committed in .gitmodules - this is the value that will be used on the first submodule update. Between initializing and updating the submodule, you can also change this URL that will be used for that first update with a command like:

git config otheruser@server:/pathtorepos

Indeed, you may need to do this if the first update fails. Once the submodule has been updated for the first time, the URL you need to change is that defined for origin within the submodule - at that point it's only useful to set the config value in the main project if you're likely to be deleting and re-updating the submodule.

Solution 2 - Git

The other user has to alter the .git/config file to change the user name to his own username. That way, git uses the right user to connect to the server.

[submodule "path/to/module"]
    url = ssh://otheruser@server/pathtorepos

Solution 3 - Git

Don't use absolute URLs! In an open-source project we enter a RELATIVE URL in the .gitmodules file. This will cause git to clone the submodule URL based on the URL being cloned by the parent project's URL pattern. Using a relative path neatly avoids specifying protocol (https, ssh) and username entirely. For example:

[submodule "my/tests/schemas"]
    path = my/tests/schemas
    url = ../my-schema

p.s. after posting I realized that my answer is a dupe, here is the source you should use:

Solution 4 - Git

Just for reference, the solution I ended up using is the following. It is actually possible for others to check out the existing repository.

When I need to check out the repository it can be done with the commands

git clone ssh://[email protected]/path/to/superrepos
cd superrepos
git submodule init
git submodule update

For others to check out the super repository, the following set of commands is used. The only difference is the manual cloning of the other repository

git clone ssh://[email protected]/path/to/superrepos
cd superrepos
git clone ssh://[email protected]/path/to/other/repos
git submodule init
git submodule update

Note that after issuing the

git submodule init

command, git will tell you that the requested repository and the available is not identical. But this is not fatal and you can safely continue.

Solution 5 - Git

Do not include the username in the URL. git will prompt for the username and password when you clone/pull/etc

Solution 6 - Git

My 2 cents:
I had a problem updating the Submodule repo from within the Parent with the same user who created the repo. I found it was caused by the passphrase on the SSH key. When the Parent - Child repositories are connected as submodules and persisted to Git, I tried to clone the project to a new location. Cloning the parent succeeded (when cloning with an SSH key, I entered passphrase for the key). However, the git submodule update command failed with Permission denied (publickey...), without asking for the passphrase. When I removed the passphrase, the update command ran successfully.


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmidtibyView Question on Stackoverflow
Solution 1 - GitMark LongairView Answer on Stackoverflow
Solution 2 - GitIkkeView Answer on Stackoverflow
Solution 3 - GitchrisinmtownView Answer on Stackoverflow
Solution 4 - GitmidtibyView Answer on Stackoverflow
Solution 5 - GityanoView Answer on Stackoverflow
Solution 6 - GitgenchevView Answer on Stackoverflow