Git子模块和ssh访问

mid*_*iby 42 git ssh git-submodules

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

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

mkdir projectname
cd projectname
git init
git submodule add ssh://myusername@server/pathtorepos
Run Code Online (Sandbox Code Playgroud)

当一个不同的用户("otheruser")然后克隆超级存储库时,一切似乎都有效.但是,是时候访问子模块了

git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)

git尝试使用"myusername"而不是"otheruser"克隆子模块.

如何解决这个问题呢?

Mar*_*air 41

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

 cd my-submodule
 git remote set-url origin otheruser@server:/pathtorepos
Run Code Online (Sandbox Code Playgroud)

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

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

git config submodule.my-submodule.url otheruser@server:/pathtorepos
Run Code Online (Sandbox Code Playgroud)

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

  • 在`.gitmodules`**中使用基于SSH的URL是合理的,如果**它们不包含用户名(每个最终用户可以配置`.ssh/config`来提供自己的服务器用户名,如果它们不同于本地用户名).其次,`git submodule init`将子模块条目从`.gitmodules`复制到`.git/config`,所以有一个点(在'init`之后,但在第一次使用`git submodule update`之前),你在哪里可以在克隆之前重新配置子模块的URL.如果已经克隆了子模块,那么你的`(cd sub && git config remote.origin.url ...)`也是必需的. (4认同)
  • @Chris Johnsen:我已经添加了关于你的第一点的注释 - 谢谢。我很清楚后一点,但我一直在努力让子模块的答案保持简单,这样它们就不会全部变成[漫无目的的博客文章](http://longair.net/blog /2010/06/02/git-submodules-explained/) 关于子模块可能处于的所有不同状态...无论如何,我也会更新这个答案来描述这种情况:( (2认同)

Ikk*_*kke 12

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

[submodule "path/to/module"]
    url = ssh://otheruser@server/pathtorepos
Run Code Online (Sandbox Code Playgroud)


chr*_*own 10

不要使用绝对 URL!在一个开源项目中,我们在 .gitmodules 文件中输入一个相对 URL。这将导致 git 根据父项目的 URL 模式克隆的 URL 克隆子模块 URL。使用相对路径巧妙地避免了完全指定协议(https、ssh)和用户名。例如:

[submodule "my/tests/schemas"]
    path = my/tests/schemas
    url = ../my-schema
Run Code Online (Sandbox Code Playgroud)

ps 发布后我意识到我的答案是一个骗局,这是您应该使用的来源:Automatically access git submodules via ssh or https