让git使用与父模块相同的协议获取子模块?

让git使用与父模块相同的协议获取子模块?,git,git-submodules,Git,Git Submodules,是否有一种方法可以设置存储库,以便通过ssh或https克隆存储库的任何用户也可以通过与父模块相同的协议克隆存储库中包含的任何子模块 如果这是不可能的,那么这个事实(最好是引用git设计者做出选择的原因)将是一个有效的答案 我强烈要求不要(因为我已经知道了),我认为这不是一个有用的答案: 让它总是使用其中一个 一种方式 当子模块与主repo托管在同一台服务器上时,这是Git的常见行为子模块.somename.url将位于中,例如。/somename.git将位于中。gitmodules,而g

是否有一种方法可以设置存储库,以便通过
ssh
https
克隆存储库的任何用户也可以通过与父模块相同的协议克隆存储库中包含的任何子模块


如果这是不可能的,那么这个事实(最好是引用git设计者做出选择的原因)将是一个有效的答案

<>我强烈要求不要(因为我已经知道了),我认为这不是一个有用的答案:

  • 让它总是使用其中一个
  • 一种方式

当子模块与主repo托管在同一台服务器上时,这是Git的常见行为<代码>子模块.somename.url将位于
中,例如
。/somename.git
将位于
中。gitmodules
,而
git子模块init
将填充
url中缺少的位

为什么任何人都希望可以使用与本地项目相同的协议访问任意外部子模块?除非
origin
协议在任意外部子模块的服务器上工作,否则配置您的repos以使初始设置失败只是自找麻烦。可以通过
ssh
与project server对话的人不太可能在其他地方拥有或想要
ssh
访问权限


如果您想要自定义协议复制设置,它就像五行shell代码,编写它要比学习一些新的冗余调整工具更容易,更不用说实现一个了。

没有办法做到这一点,因为Git没有内在的方法知道使用不同协议的多个URL映射到同一个存储库

例如,GitHub在其服务器上使用的映射不适合我的个人Git服务器,它使用Gitolite。类似地,通常不提供通过SSH的匿名访问,因此如果用户在服务器上没有帐户,则不能使用SSH URL。Git无法预先了解此配置


Git提供了
而不是
映射,因此您可以根据需要覆盖这些设置。假定用户最了解他们的需求和配置以及他们正在访问的服务器。

似乎只要使用
ssh://git@github.com/user/repo.git
表单,而不是
git@github.com:user/repo.git
表单。至少只要它们都在同一台服务器上就可以了。

没有,但我不知道他们为什么这样做(除了明显的“因为它很容易”)。根据我所看到的,我相信
。/someuser/somename.git
可以工作,但
。/../someuser/somename.git
不能(它似乎在本地文件系统或类似的文件系统中解析为
~/someuser/somename.git
)。我认为现在的情况是SSH URL在主机后放置了一个
,因此第二个
。/
会吃掉主机和其他东西以及预期的组件。--至于原因:我认为尊重用户的默认选择是允许这样做的充分理由。我怀疑,在大多数情况下,这两种情况都是:1)模块与引用对象位于同一服务器上,因此两个模块的访问控制相同(或至少可以知道),或2)它们位于不同的服务器上,因此应使用绝对路径,此时目标服务器的访问控制再次可以知道。-不管怎样,当它可用时,似乎应该能够创建一个相对URL(路径或协议相对),以获得我想要的内容。在必须强制协议的地方,应该已经使用了绝对URL。在这种情况下,Git不支持协议相对URL,尽管我们当然乐意接受补丁。在一般情况下,您想要做的事情是无法实现的,当然,如果您对您的案例有专门的了解,可以使用路径相关URL来完成。我的回答代表一般情况。