Git子模块和SSH访问

ibps3vxo  于 12个月前  发布在  Git
关注(0)|答案(7)|浏览(126)

我在一个包含几个子模块的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”来克隆子模块。
如何解决这一问题?

ar7v8xwq

ar7v8xwq1#

如果可能的话,最好确保.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在下面指出,如果省略用户名,那么在.gitmodules中使用SSH URL也是合理的,并且存储库的所有用户都将拥有SSH访问权限-如果本地和远程用户名不同,他们需要类似于上面添加他们的用户名。
请注意,.gitmodules中的URL仅在 * 初始化 * 子模块时使用。初始化子模块将主项目中的配置值submodule.<SUBMODULE-NAME>.url设置为.gitmodules中提交的任何值-这是将在第一次子模块更新时使用的值。在初始化和更新子模块之间,您也可以使用以下命令更改将用于第一次更新的URL:

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


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

nzkunb0c

nzkunb0c2#

不要使用绝对URL!在一个开源项目中,我们在添加子模块时使用了一个RELATIVE 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


这样,没有人需要编辑模块文件。
p.s.发帖后我意识到我的答案是一个骗局,这里是你应该使用的来源:用途:Automatically access git submodules via ssh or https

xt0899hw

xt0899hw3#

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

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

字符串

igetnqfo

igetnqfo4#

仅供参考,我最终使用的解决方案如下。其他人实际上可以 checkout 现有的存储库。
当我需要 checkout 存储库时,可以使用以下命令完成

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

字符串
对于其他人 checkout 超级存储库,使用以下命令集。

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会告诉你请求的仓库和可用的仓库不一样。但这不是致命的,你可以安全地继续。

gdx19jrr

gdx19jrr5#

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

ukqbszuj

ukqbszuj6#

我的两分钱:

我在Parent中更新Submodule repo时遇到了一个问题,使用的用户与创建repo的用户相同。我发现这是由SSH密钥上的密码引起的。当Parent - Child repository作为子模块连接并持久化到Git时,我尝试将项目克隆到新位置。克隆父版本成功(当使用SSH密钥克隆时,我输入了密钥的密码)。但是,git submodule update命令失败,Permission denied (publickey...)没有要求密码。当我删除密码时,更新命令成功运行。

krcsximq

krcsximq7#

安装

通常,克隆(使用ssh)的问题是git尝试使用ssh对远程进行身份验证,但失败了。您可以使用which ssh调试此过程,并使用
GIT_SSH_COMMAND="ssh -v" git clone --recurse-submodules [URL]
或者对于windows set GIT_SSH_COMMAND=ssh -v,然后运行clone命令。
虽然对于这个特定的问题,不使用子模块的绝对URL或避免向这些URL添加用户可能是一个正确的答案;我(可能还有许多其他人)来到这里寻找解决ssh访问的棘手问题的方法,我觉得这种调试在许多情况下都有帮助,就像它对我一样。

示例

我使用的是Windows CMD+ WSL 2。运行git命令的ssh -v详细输出

...
debug1: Next authentication method: publickey
debug1: Offering public key: [--].ssh/id_rsa RSA SHA256:[--]
debug1: Server accepts key: [--].ssh/id_rsa RSA SHA256:[--]
debug1: read_passphrase: can't open /dev/tty: No such device or address  <-- !!!
debug1: Trying private key: [--].ssh/id_ecdsa
debug1: Trying private key: [--].ssh/id_ecdsa_sk
debug1: Trying private key: [--].ssh/id_ed25519
debug1: Trying private key: [--].ssh/id_ed25519_sk
debug1: Trying private key: [--].ssh/id_xmss
debug1: Trying private key: [--].ssh/id_dsa
debug1: No more authentication methods to try.
git@[--]: Permission denied (publickey).
fatal: Could not read from remote repository.

字符串
这告诉我,ssh可能无法访问终端来获取rsa密钥的密码。虽然它对主存储库有效,但对子模块无效。所以过了一段时间,我在某个地方读到windows添加了自己的OpenSSH版本。git for windows安装使用了自己的ssh,无法找到终端设备。我能够通过ssh修复子模块克隆用于WSL 2 + CMD使用
set GIT_SSH_COMMAND="C:/WINDOWS/System32/OpenSSH/ssh"

相关问题