问题:
有没有办法通过与主存储库相同的方法(ssh或https)自动检出git子模块?
背景:
我们有一个非公开的gitlab存储库(main),它有一个子模块(utils),它也作为非公共gitlab存储库托管在同一台服务器上.可以通过ssh或https访问这些存储库:
user@gitlabserver.com:my/path/repo.githttps://gitlabserver.com/my/path/repo.git两种变体显然都需要不同形式的认证,并且取决于客户端计算机和用户,优选一种或另一种.
对于main不是问题的顶级存储库(),任何人都可以选择他或她喜欢的方法,但对于子模块,这取决于.gitmodules文件,因此(最初)对所有人都是相同的.
现在,而不是每个人都必须将.gitmodules文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法只需指定服务器和repo路径并且git选择其中一个,那就太好了.用于主repo的方法,或者可以在gitconfig中设置的方法.
我使用git(TortoiseGit 1.7.5.0)并拥有一个带子模块的repo,它们通过以下方式通过绝对路径引用:
[submodule "common/sub"]
path = common/sub
url = ssh://localhost/lib/common/sub
Run Code Online (Sandbox Code Playgroud)
虽然super-repo被克隆为ssh://user@localhost/super,但用户名不应该进入每个子模块url,因为不同的用户应该使用自己的凭据来处理代码.
当拉/推子模块时,我必须输入我的登录名(不需要密码,因为我正在运行Pageant):用户名不会通过命令行传递给TortoisePlink.
在网上冲浪,我发现有几个帖子提到子模块的相对网址,但显然这种方法与TortoiseGit不兼容:我尝试了几种格式 - 程序经常崩溃.无论如何,我成功的格式如下:
[submodule "common/sub"]
path = common/sub
url = ../common/sub
Run Code Online (Sandbox Code Playgroud)
该文件.git/config填充了正确的绝对URL,但在那之后TortoiseGit崩溃了......
我已经回顾了其他选项,包括:
其中一个工作解决方法是使用"非标准"URL初始化子模块,如git子模块解释结束时所述(此处链接已在此处找到).
我想一些更简单的解决方法可能对我的情况有帮助(比如在某些本地配置文件中或通过命令行提供默认登录),但我没有找到任何可行的提示.
而这个问题:什么是使用子模块没有绝对URL硬编码的用户名的最简单的方法?
我对 github 代码空间上的子模块有疑问。
当我使用命令时
git submodule update --init
Run Code Online (Sandbox Code Playgroud)
终端显示给我
Warning: Permanently added 'github.com,xxxxx' (ECDSA) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud) 我们正在迁移到git.我们有大量的模块构成我们的产品,其中一些模块在产品之间共享.该产品由"瘦"超级存储库(ssh://server/product.git)表示,该存储库仅包含子模块:
[submodule "module1"]
path=module1
url=ssh://server/product/module1.git
[submodule "module2"]
path=module2
url=ssh://server/product/module2.git
...
Run Code Online (Sandbox Code Playgroud)
我可以克隆超级存储库并使用子模块并提交它们,然后将子模块提交到超级存储库.
当我想引入另一层时,问题出现了.有两种基本方案(这可以组合起来制作更复杂的设置,但任何东西都应该是这些的组合):
作为开发人员,我克隆了一个中央存储库并开始工作.然后我想将我的代码提交到我们的持续集成服务器,然后再将我的更改合并到中央存储库.我让CI服务器克隆我的repo.这不起作用,CI服务器将克隆我的超级仓库,然后它将从中央存储库位置克隆子模块(因为它是在.gitmodules中所说的).
作为一个团队,我们希望在sprint结束之前将我们的代码合并到中央存储库之前,我们需要一个集成存储库.出于同样的原因,这失败了.
我尝试为子模块指定相对URL,但这也不起作用,因为当我们将第二层克隆到第三层时,相对URL相对于第二层存储库位置解析,但第二层子模块位置在第二层超级存储库.
我能同时拥有它吗?Git子模块和n层存储库结构?
不知道标题是否描述了我想说的内容,但这里是:
我想知道使用git子模块设置Jenkins时的"最佳实践".main和submodule repo都可以通过ssh访问,因为我们有几个用户,所有这些用户都有自己的用户名.对于拥有自己用户的Jenkins也是如此.但是,我们(我)偶然发现了一个问题.如果我创建一个子模块: git submodule添加ssh:// my-user-name @ address-to-module-repo并推送它,Jenkins会在尝试获取子模块时将我称为用户,这显然会失败.如果其他一些用户执行了拉取,我的用户名仍然在路径中(在.gitmodule,.git/config等等).
我在"普通"用户之间发现了另一个帖子Git子模块和ssh访问处理共享,但是当Jenkins尝试构建时,它并没有真正解决问题,因为我只允许在Jenkins取出所有我无法执行的操作后执行shell cmd如链接中提到的那样,还是可以(Jenkins新手)?
所以,总结一下.如何解决这个问题,以便在通过ssh获取子模块时Jenkins将使用自己的用户?
Br,Pistol先生
git ×5
codespaces ×1
fetch ×1
github ×1
gitlab ×1
jenkins ×1
relative-url ×1
ssh ×1
tortoisegit ×1