Git子模块和ssh访问

时间:2011-05-17 13:28:28

标签: git ssh git-submodules

我在使用包含多个子模块的git存储库时遇到了一些麻烦。

使用命令

构建超级git存储库
mkdir projectname
cd projectname
git init
git submodule add ssh://myusername@server/pathtorepos

当一个不同的用户(“otheruser”)然后克隆超级存储库时,一切似乎都有效。但是什么时候可以访问子模块

git submodule init
git submodule update

git尝试使用“myusername”而不是“otheruser”克隆子模块。

如何解决这个问题?

5 个答案:

答案 0 :(得分:36)

如果可能,最好确保.gitmodules文件包含可由任何人克隆的存储库的URL,通常是git://http:// URL。然后,具有SSH访问权限的用户可以在克隆后更改为子模块,并将remote.origin.url中的URL更改为指向具有其用户名的SSH URL,例如:

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

即使在当前情况下,其他用户也应该能够这样做。 更新:Chris Johnsen在下面指出,如果您省略用户名并且存储库的所有用户都具有SSH访问权限,则.gitmodules中使用SSH URL也是合理的 - 如果本地和远程不同,他们需要添加与上述类似的用户名。

请注意,.gitmodules中的网址仅在初始化子模块时使用。初始化子模块将主项目中的配置值submodule.<SUBMODULE-NAME>.url设置为.gitmodules中提交的任何内容 - 这是将在第一个子模块更新时使用的值。在初始化和更新子模块之间,您还可以使用以下命令更改将用于第一次更新的URL:

git config submodule.my-submodule.url otheruser@server:/pathtorepos

实际上,如果第一次更新失败,您可能需要这样做。第一次更新子模块后,您需要更改的URL是在子模块中为origin定义的URL - 此时它只对设置submodule.my-submodule.url配置值有用如果您可能正在删除并重新更新子模块,则在主项目中。

答案 1 :(得分:10)

其他用户必须更改.git/config文件才能将用户名更改为自己的用户名。这样,git就会使用合适的用户连接到服务器。

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

答案 2 :(得分:4)

要在开源项目中解决此问题,我们在.gitmodules文件中输入RELATIVE URL。这将导致git根据父项目的URL模式克隆的URL克隆子模块URL。使用相对路径可以完全避免完全指定协议(https,ssh)和用户名:

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

P.S。发布后我意识到我的答案是一个骗局,这里是您应该使用的来源:Automatically access submodule via ssh or https

答案 3 :(得分:2)

仅供参考,我最终使用的解决方案如下。 其他人实际上可以检查现有的存储库。

当我需要检查存储库时,可以使用命令

完成
git clone ssh://myusername@server.dk/path/to/superrepos
cd superrepos
git submodule init
git submodule update

对于其他人来检查超级存储库,使用以下命令集。 唯一的区别是手动克隆其他存储库

git clone ssh://otheruser@server.dk/path/to/superrepos
cd superrepos
git clone ssh://otheruser@server.dk/path/to/other/repos
git submodule init
git submodule update

注意发出

之后
git submodule init

命令,git会告诉您所请求的存储库和可用的存储库不相同。但这不是致命的,你可以安全地继续下去。

答案 4 :(得分:0)

请勿在网址中包含用户名。克隆/拉/ /等时,git会提示输入用户名和密码