Git子模块的不同推/拉URL

11

我在一个大型项目中使用Git超级项目模式,该项目由一个没有存储库帐户的Teamcity构建代理部署,但是存储库设置为允许匿名克隆。因此,我已经使用它们的http:// URL而不是git URL来设置子模块。但问题在于存储库拒绝http推送:

Total 0 (delta 0), reused 0 (delta 0)
error: RPC failed; result=22, HTTP code = 401
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

因此,每当我在切换分支时更新子模块时,我都需要执行git remote add-url --push以添加git:// URL。

有没有办法在超级项目中设置子模块,使它们已经使用http:// URL进行拉取,并使用git:// URL进行推送呢?


1
可以在.git/submodules/<sub>/config中设置pushURL - soulseekah
1个回答

6

LibreOffice项目也使用子模块,包括:

默认情况下,您的子模块仓库处于“分离头指针”状态,这意味着被检出的提交(超级项目核心需要的提交)没有与本地分支名称关联。

不要忘记为您正在使用的子模块添加正确的pushurl,否则您将无法提交。

$ editor .git/modules/submodule/config

[remote "origin"] 部分中添加:
pushurl = ssh://logerrit/submodule

类似于soulseekah评论(在您的情况下,使用git://地址)

您也可以通过(在子模块中)完成此操作

git config remote.origin.pushurl git://...

如果你不这样做,就像这个项目所示,你将会得到一个:
fatal: The remote end hung up unexpectedly

那么一旦完成了,有没有办法将该配置推送到存储库,以便任何新的克隆都可以获取它? - theheadofabroom
@BiggAl 不,这是一个本地配置文件,不会被推送。 - VonC
作为自己的备忘录,vime搜索和替换可以在.submodules中使用g:url=:s:^\(.\+\)url=http\(.\+\)/\(qa/.\+\)$:\1url=http\2/\3\r\1pushurl=git\2\:\3:或在.git/config中使用g:url = :s:^\(.\+\)url = http\(.\+\)/\(qa/.\+\)$:\1url = http\2/\3\r\1pushurl = git\2\:\3: - theheadofabroom
1
我认为这是拥有不同的推送仓库地址的最佳方法,因为.gitmodules中的获取URL无需更改,并且可以被任何其他不需要进行推送操作的用户下载。 - Fwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接