有没有办法在一台机器上使用一个子模块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 sync
和git submodule update --init -r
将直接从经过身份验证的计算机而不是从服务器获取子模块。
我的问题是,是否有任何可移植的方式来执行此操作,以便我可以在计算机之间自由移动并期望正确的git-submodule
行为?
答案 0 :(得分:6)
您可以在.git/config
中更改子模块属性。在您的情况下,您可以从url
部分更改[submodule "<name>"]
。请注意,这些属性无法生存git submodule deinit
,git 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 answerurl
.git/config
.gitmodules
中的submodule update
覆盖<{1}}(see here)的 编辑每个克隆本地(未跟踪,未绑定到提交),因此使其成为完美的解决方案。可以在主repo的(非递归)克隆之后和service/<cluster_name>/<service_name>
之前完成更改。所有学分都在那里!