Git 子模块和 ssh 访问

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

使用这些命令构建了超级 git 存储库

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

当一个不同的用户(“其他用户”)然后克隆超级存储库时,一切似乎都解决了。但是当需要访问子模块时

git submodule init
git submodule update

Git 试图使用“ myusername”而不是“ other user”来克隆子模块。

如何解决这个问题?

89043 次浏览

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

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

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

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

即使在当前情况下,其他用户也应该能够做到这一点。Chris Johnsen 在下面指出,在 .gitmodules中使用 SSH URL 也是合理的,如果你省略了用户名,那么存储库的所有用户都可以访问 SSH ——如果本地和远程用户名不同,他们需要添加类似于上面的用户名。

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

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

实际上,如果第一次更新失败,您可能需要这样做。一旦子模块第一次被更新,你需要更改的 URL 是在子模块中为 origin定义的——在这一点上,只有当你可能要删除和重新更新子模块时,在主项目中设置 submodule.my-submodule.url配置值才是有用的。

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

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

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 将告诉您所请求的存储库和可用的存储库是不相同的。但这不是致命的,你可以安全地继续。

当您克隆/pull/etc 时,不要在 URL. git 中提示输入用户名和密码

不要使用绝对 URL!在一个开源项目中,我们在添加子模块时使用了一个相对 URL,并将其放入 .gitmodules文件中。这将导致 git 基于父项目的 URL 克隆子模块 URL。使用相对路径可以避免完全指定协议(https、 ssh)和用户名。

例如,如果您想要的子模块可以从您的 Git 服务器作为对等存储库使用,那么在您的回购的根目录中添加该对等子模块,如下所示:

git submodule add ../my-schema my/tests/schemas

然后创建/扩展 .gitmodules文件,使用如下条目:

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

这样,就不必编辑模块文件。

在发布后我意识到我的答案是一个骗局,这里是你应该使用的来源: 通过 ssh 或 https 自动访问 git 子模块

我的建议是:
我有一个问题更新子模块回购从内部的父用户谁创建的回购。我发现它是由 SSH 密钥上的密码引起的。当 Parent-Child 存储库作为子模块连接并持久化到 Git 时,我尝试将项目克隆到一个新位置。克隆成功了(当用 SSH 密钥克隆时,我输入了密钥的密码)。但是,git submodule update命令在使用 Permission denied (publickey...)时失败,没有询问密码短语。删除密码后,update 命令成功运行。