通过ssh或https自动访问git子模块

时间:2016-11-28 10:21:08

标签: git gitlab git-submodules

问题:
有没有办法通过与主存储库相同的方法(ssh或https)自动检出git子模块?

背景

我们有一个非公开的gitlab存储库(utils),它有一个子模块(user@gitlabserver.com:my/path/repo.git),它也作为非公共gitlab存储库托管在同一台服务器上。可以通过ssh或https:

访问这些存储库
  • https://gitlabserver.com/my/path/repo.git
  • main

两种变体显然都需要不同形式的身份验证,并且根据客户端计算机和用户的不同,首选其中一种。

对于不存在问题的顶级存储库(.gitmodules),任何人都可以选择他或她喜欢的方法,但对于子模块,这取决于private static JSONObject get(Context ctx, String sUrl) { HttpURLConnection connection = null; try { URL url = new URL(sUrl); connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Authorization", "Basic " + encodedAuthentication); connection.setRequestProperty("Accept-Charset", "utf-8,*"); Log.d("Get-Request", url.toString()); try { BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(connection.getInputStream())); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append("\n"); } bufferedReader.close(); Log.d("Get-Response", stringBuilder.toString()); return new JSONObject(stringBuilder.toString()); } finally { connection.disconnect(); } } catch (Exception e) { Log.e("ERROR", e.getMessage(), e); return null; } } private static String buildSanitizedRequest(String url, Map<String, String> mapOfStrings) { Uri.Builder uriBuilder = new Uri.Builder(); uriBuilder.encodedPath(url); if (mapOfStrings != null) { for (Map.Entry<String, String> entry : mapOfStrings.entrySet()) { Log.d("buildSanitizedRequest", "key: " + entry.getKey() + " value: " + entry.getValue()); uriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); } } String uriString; try { uriString = uriBuilder.build().toString(); // May throw an // UnsupportedOperationException } catch (Exception e) { Log.e("Exception", "Exception" + e); } return uriBuilder.build().toString(); } 文件,因此(最初)对所有人都一样 现在,而不是每个人都必须将.gitmodules文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法可以指定服务器和repo路径并且git选择,那就太好了可以使用与主存储库相同的方法,也可以在gitconfig中设置。

2 个答案:

答案 0 :(得分:37)

我最终通过将子模块url指定为relative path

来解决了这个问题

让我们说你的主要git存储库可以到达

  • 通过https://gitlabserver.com/my/path/main.git
  • 或通过user@gitlabserver.com:my/path/main.git

.gitmodules文件如下所示:

[submodule "utils"]     
    path = libs/utils   
    url = https://gitlabserver.com/my/path/utils.git

这意味着即使您通过ssh检出主应用程序,子模块工具仍然可以通过https访问。

但是,你可以用这样的相对路径替换绝对路径:

[submodule "utils"]     
    path = libs/utils   
    url = ../utils.git

从现在开始使用

  • git clone --recursive https://gitlabserver.com/my/path/main.git
  • git clone --recursive user@gitlabserver.com:my/path/main.git

获取您想要的整个存储库结构。显然,这对于相对ssh和https路径不相同的情况不起作用,但至少对于gitlab托管的存储库来说就是这种情况。

如果您(无论出于何种原因)在两个不同的远程站点镜像您的存储库结构,这也很方便。

答案 1 :(得分:9)

我认为我有一个更笼统的答案,但这并不完全是自动的。您可以在~/.gitconfig中应用一个配置设置,该设置将用您选择的一个替换特定的URL。

对于Github,我在~/.gitconfig中有此名称:

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

这是一个带有子模块的存储库,该子模块使用HTTPS url声明,我可以使用HTTPS递归克隆

git clone --recursive https://github.com/p2/OAuth2.git

OR

git clone --recursive git@github.com:p2/OAuth2.git

您可以在此处了解其用法:https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf

在这里:https://git-scm.com/docs/git-clone