Git子模块和ssh访问

问题描述 投票:38回答:5

我在使用包含多个子模块的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”克隆子模块。

如何解决这个问题呢?

git ssh git-submodules
5个回答
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中的URL仅在初始化子模块时使用。初始化子模块将主项目中的配置值submodule.<SUBMODULE-NAME>.url设置为.gitmodules中提交的任何值 - 这是将在第一个子模块更新时使用的值。在初始化和更新子模块之间,您还可以使用以下命令更改将用于第一次更新的URL:

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

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


10
投票

另一个用户必须更改.git/config文件以将用户名更改为他自己的用户名。这样,git使用正确的用户连接到服务器。

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

4
投票

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

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

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


2
投票

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

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

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

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

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

注意发出后

git submodule init

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


0
投票

不要在URL中包含用户名。克隆/拉/等时,git会提示输入用户名和密码

© www.soinside.com 2019 - 2024. All rights reserved.