我正在将我们产品的源代码组织到一堆不同的 Git 存储库中。(而且我是 Git 的新手)。其中一些将通过子模块使用同一服务器上的其他存储库。
据我了解,Git 中的子模块是指向另一个存储库中特定提交的指针,其定义如下:
问题是当添加子模块时,一个 URL 作为提交的一部分存储在存储库中。如果 URL 更改会发生什么?父存储库可能有数百个提交——所有提交都带有一个引用旧 URL 的子模块。
例如,假设我将存储库 Super 和 Sub 存储在 git://PrivateCompanyServer/repositories/* 中。Super 通过其 gitmodules 文件引用 Sub:git://PrivateCompanyServer/repositories/Sub.git。一些开发人员对 Super 进行了数百次提交——几乎 Super 中的每个提交都有一个包含该 URL 的 gitmodules 快照。几个产品版本被标记,各种分支在 gitmodules 中都有 URL。现在,假设 PrivateCompanyServer 崩溃,我们将代码移动到另一台服务器。或者我们重新组织 PrivateCompanyServer 上的目录结构。管他呢。现在我们在 Super 中有数百个提交,这些提交引用了不再存在的旧 URL 上的 Sub 存储库。显然,gitmodules 文件可以在 development 分支的头部进行更正,我们可以继续前进。但是由于维护原因,我们可能不得不返回各种旧提交,并且它们都将引用不再起作用的旧 URL。怎么处理?
显然,这可以通过变基/“重写历史记录”来解决,以便存储库中的所有 gitmodules 文件都有新的 URL,但我认为这不是一个选项,因为 Super 中的几乎每个提交都会获得一个新的提交 ID。引用 Super 的所有内容,包括使用 Super 作为子模块的“Super-Super”项目和本地开发人员存储库都会中断 - 对吗?
那么处理这个问题的最佳方法是什么? 如果您在私人公司服务器上存储一组存储库 - 其中一些通过子模块引用其他存储库 - 当服务器更改名称时您会怎么做 - 因此使 gitmodules 文件中的旧 URL 无效?
我能想到的唯一解决方法是从历史上的每个提交方式创建“大量分支”,只是为了保存更正的 gitmodules。看起来那样会造成很多混乱和麻烦。似乎必须有更好的方法 - 我肯定错过了什么吗?
只要您不运行git submodule sync,在子模块第一次初始化之后, in 的值.gitmodules就不会影响给定签出中的子模块路径(之后,子模块的路径将保留在文件中.git/config)。
因此,您只需更改结帐中的路径一次(git submodule sync在具有更新路径的提交上使用),它将持续存在,不会出现问题。