我在一个包含几个子模块的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”来克隆子模块。
如何解决这一问题?
7条答案
按热度按时间ar7v8xwq1#
如果可能的话,最好确保
.gitmodules
文件包含任何人都可以克隆的存储库的URL,通常是git://
或http://
URL。然后拥有SSH访问权限的用户可以在克隆后更改为子模块,并将remote.origin.url
中的URL更改为指向带有用户名的SSH URL,例如:字符串
即使在当前的情况下,其他用户也应该能够这样做。**更新:**Chris Johnsen在下面指出,如果省略用户名,那么在
.gitmodules
中使用SSH URL也是合理的,并且存储库的所有用户都将拥有SSH访问权限-如果本地和远程用户名不同,他们需要类似于上面添加他们的用户名。请注意,
.gitmodules
中的URL仅在 * 初始化 * 子模块时使用。初始化子模块将主项目中的配置值submodule.<SUBMODULE-NAME>.url
设置为.gitmodules
中提交的任何值-这是将在第一次子模块更新时使用的值。在初始化和更新子模块之间,您也可以使用以下命令更改将用于第一次更新的URL:型
实际上,如果第一次更新失败,您可能需要这样做。一旦子模块第一次更新,您需要更改的URL就是子模块中为
origin
定义的URL-此时,只有在您可能要删除并重新更新子模块时,才需要在主项目中设置submodule.my-submodule.url
配置值。nzkunb0c2#
不要使用绝对URL!在一个开源项目中,我们在添加子模块时使用了一个RELATIVE URL,它会放在
.gitmodules
文件中。这会导致git根据父项目的URL克隆子模块的URL。使用相对路径巧妙地避免了指定协议(https,ssh)和用户名。例如,如果你想要的子模块可以从你的Git服务器上作为对等仓库获得,在你的仓库的根目录下像这样添加对等子模块:
字符串
然后,
.gitmodules
文件被创建/扩展为这样的条目:型
这样,没有人需要编辑模块文件。
p.s.发帖后我意识到我的答案是一个骗局,这里是你应该使用的来源:用途:Automatically access git submodules via ssh or https
xt0899hw3#
另一个用户必须修改
.git/config
文件,将用户名改为他自己的用户名,这样git就可以使用正确的用户连接到服务器。字符串
igetnqfo4#
仅供参考,我最终使用的解决方案如下。其他人实际上可以 checkout 现有的存储库。
当我需要 checkout 存储库时,可以使用以下命令完成
字符串
对于其他人 checkout 超级存储库,使用以下命令集。
型
请注意,在发出
型
命令,git会告诉你请求的仓库和可用的仓库不一样。但这不是致命的,你可以安全地继续。
gdx19jrr5#
不要在URL中包含用户名。当你克隆/pull/etc时,git会提示你输入用户名和密码
ukqbszuj6#
我的两分钱:
我在Parent中更新Submodule repo时遇到了一个问题,使用的用户与创建repo的用户相同。我发现这是由SSH密钥上的密码引起的。当Parent - Child repository作为子模块连接并持久化到Git时,我尝试将项目克隆到新位置。克隆父版本成功(当使用SSH密钥克隆时,我输入了密钥的密码)。但是,
git submodule update
命令失败,Permission denied (publickey...)
没有要求密码。当我删除密码时,更新命令成功运行。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
详细输出字符串
这告诉我,ssh可能无法访问终端来获取rsa密钥的密码。虽然它对主存储库有效,但对子模块无效。所以过了一段时间,我在某个地方读到windows添加了自己的OpenSSH版本。git for windows安装使用了自己的ssh,无法找到终端设备。我能够通过ssh修复子模块克隆用于WSL 2 + CMD使用
set GIT_SSH_COMMAND="C:/WINDOWS/System32/OpenSSH/ssh"
个