我在使用包含多个子模块的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”克隆子模块。
如何解决这个问题?
答案 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会提示输入用户名和密码