在不同的计算机上使用不同的git子模块URL

时间:2016-12-08 17:07:12

标签: git

有没有办法在一台机器上使用一个子模块URL,但在另一台机器上使用不同的子模块URL?

假设我有一台机器已经对中央服务器上的git存储库进行了身份验证SSH访问,而另一台机器无法访问该服务器。在经过身份验证的计算机上,我使用git-daemon将存储库共享给未经身份验证的计算机。

这里的问题是我克隆的存储库有几个子模块依赖项,所有这些都是服务器上需要经过身份验证的SSH访问的存储库。在这种情况下,我还将所有子模块存储在我的经过身份验证的计算机上,因此我只需更新.gitmodules文件:

[submodule "@sub-a"]
    url = ssh://<authenticated-url>/<repo>
    branch = master

为...

[submodule "@sub-a"]
    url = git://<ip-of-authenticated-machine>/<repo>
    branch = master

然后运行git submodule syncgit submodule update --init -r将直接从经过身份验证的计算机而不是从服务器获取子模块。

我的问题是,是否有任何可移植的方式来执行此操作,以便我可以在计算机之间自由移动并期望正确的git-submodule行为

2 个答案:

答案 0 :(得分:6)

您可以在.git/config中更改子模块属性。在您的情况下,您可以从url部分更改[submodule "<name>"]。请注意,这些属性无法生存git submodule deinitgit submodule sync 详述

git submodule deinit     # deinitialize submodule, relevant section in .git/config will be removed
rm -fdr .git/modules/    # clear submodules' local repos
git submodule init       # relevant section will be copied (partially) from .gitmodules to .git/config
...                      #Edit .git/config with new url for submodule
git submodule update     # submodule will be updated from new url.

答案 1 :(得分:1)

如果附带说明,它会算是便携式吗?

您可以让.gitmodules中的子模块指向本地目录,例如url = ../submodule。主存储库将包含此路径(两台机器相同),但是它们会将其他内容克隆到各自的submodule目录中,这些目录在与主存储库的克隆相同的目录中创建。子模块更新可以理解为必须分两步完成:从服务器到submodule的正常提取,然后是从本地克隆到主模块的submodule update

您可能还希望查看提出相同解决方案的相关问题here。我不知道更好的方法。

their answer url .git/config .gitmodules中的submodule update覆盖<{1}}(see here)的

编辑每个克隆本地(未跟踪,未绑定到提交),因此使其成为完美的解决方案。可以在主repo的(非递归)克隆之后和service/<cluster_name>/<service_name>之前完成更改。所有学分都在那里!