如果Git子模块移动到另一个服务器,该如何处理?

8
我正在将我们产品的源代码组织成许多不同的Git存储库。(我对Git还很陌生。)其中一些将通过子模块使用同一服务器上的其他存储库。
据我所知,Git中的子模块是指向另一个存储库中特定提交的指针,由以下内容定义:
- 远程子模块的URL(例如git://foo.com/git/lib.git) - 克隆子模块的存储库的子目录(例如include/foo) - 我们正在引用的提交ID
问题在于,在添加子模块时,URL作为提交的一部分存储在存储库中。如果URL更改会发生什么?父存储库可能有数百个提交 - 所有这些提交都使用子模块引用旧的URL。
例如,假设我将Super和Sub存储库存储在git://PrivateCompanyServer / repositories / *中。 Super通过其gitmodules文件引用Sub:git://PrivateCompanyServer / repositories / Sub.git。几个开发人员对Super进行了数百次提交 - 几乎每个提交都有带有该URL的gitmodules的快照。标记了几个产品发布,并且所有种类的分支都在gitmodules中具有URL。现在,假设PrivateCompanyServer崩溃并且我们将代码移动到另一个服务器上。或者我们重新组织了PrivateCompanyServer上的目录结构。或者其他什么。现在,我们有数百个提交在Super中引用旧URL的Sub存储库。显然,在开发分支的头部可以更正gitmodules文件,然后我们可以继续前进。但是,由于维护原因,可能需要回到所有旧的提交,并且它们都将引用不再起作用的旧URL。如何处理?
显然,这可以通过变基/“重写历史记录”来解决,以便存储库中的所有gitmodules文件都具有新的URL,但我认为这不是一个选项,因为Super中几乎每个提交都会获得新的提交ID。包括使用Super作为子模块和本地开发人员存储库的所有引用Super-Super项目在内的所有引用都将中断,对吗?
那么,应该如何处理?如果您在私有公司服务器上存储一组存储库 - 其中一些通过子模块引用其他存储库 - 当服务器更改名称时,从而使gitmodules文件中的旧URL无效,该怎么办?
我唯一能想到的解决方法是从历史上的每个提交处制作“大量分支”,以仅保存更正的gitmodules。看起来这将产生很多混乱并且很麻烦。似乎必须有更好的方法 - 我肯定漏掉了什么?
1个回答

6
只要你不运行git submodule sync,则在初始化子模块后,.gitmodules中的值将不会影响给定检出的子模块路径(此后,子模块的路径保存在.git/config文件中)。因此,您只需更改一次检出中的路径(使用带有更新路径的提交上的git submodule sync),它就会持久化而不会出现问题。

1
通过在谷歌上搜索 git submodule sync,我找到了这个有用的问题,它提供了更多信息:https://dev59.com/GHNA5IYBdhLWcg3wjOve ..... 感谢您指引我走向正确的方向! - James Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接