如果Git子模块移动到另一台服务器怎么办?

我正在将我们产品的源代码组织到一堆不同的
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提交了数百次提交 – 几乎所有Super中的提交都有一个gitmodules快照,其中包含该URL.标记了几个产品版本,并且所有类型的分支都在gitmodules中具有URL.现在,假设PrivateCompanyServer崩溃,我们将代码移动到另一台服务器.或者我们重新组织PrivateCompanyServer上的目录结构.管他呢.现在我们在Super中有数百个提交,指的是旧URL上的Sub存储库,它不再存在.显然,gitmodules文件可以在开发分支的头部进行纠正,我们可以继续前进.但是出于维护原因,我们可能需要返回各种旧提交,并且它们都将引用不再起作用的旧URL.怎么处理?

显然,这可以通过重新定位/“重写历史”来解决,以便存储库中的所有gitmodules文件都有新的URL,但我认为这不是一个选项,因为Super中的每个提交都会得到一个新的提交ID.所有引用Super的东西,包括使用Super作为子模块和本地开发人员存储库的“Super-Super”项目都会破坏 – 正确吗?

那么处理这个问题的最佳方法是什么?如果您在私有公司服务器上存储一组存储库 – 其中一些存储库通过子模块引用其他存储库 – 当服务器更改名称时您会怎么做 – 从而使gitmodules文件中的旧URL无效?

我能想到的唯一解决方法是从历史中的每个提交方式创建“大量分支”,只是为了保存更正的gitmodules.看起来这样会造成很多混乱并且很麻烦.似乎必须有更好的方法 – 当然我错过了什么?

最佳答案 只要你不运行git子模块同步,.gitmodules中的值不会影响给定checkout中的子模块路径,超过初始化子模块的时间(之后,子模块的路径保存在. git / config文件).

因此,您只需更改结帐中的路径一次(使用更新路径的提交时使用git子模块同步),它将保持不变.

点赞