如何使用子模块和n层git存储库策略工作

5

我们正在迁移到Git。我们有大量的模块组成我们的产品,其中一些模块是在产品之间共享的。产品由一个“薄”超级仓库(ssh://server/product.git)表示,它只包含子模块:

[submodule "module1"]
path=module1
url=ssh://server/product/module1.git
[submodule "module2"]
path=module2
url=ssh://server/product/module2.git
...

我可以克隆超级版本库并使用子模块来提交它们,然后提交子模块到超级版本库。但当我想引入另一层时就会出问题。有两种基本情况(这可以组合成更复杂的设置,但任何东西都应该是这些情况的组合):
1. 作为开发人员,我克隆了一个中央存储库并开始工作。然后我想在将我的更改合并到中央存储库之前将我的代码提交到我们的持续集成服务器上。我让CI服务器克隆我的repo。这行不通,CI服务器将克隆我的超级repo,然后从中央存储库位置克隆子模块(因为在.gitmodules中是这样写的)。
2. 作为团队,我们希望在将我们的代码合并到中央存储库之前,有一个集成存储库。由于同样的原因,这也失败了。
我尝试指定相对URL用于子模块,但这也行不通,因为当我们将第二层克隆到第三层时,相对URL相对于第二层存储库位置解析,但第二层子模块位置位于第二层超级存储库内。
我能同时拥有Git子模块和n层存储库结构吗?

在这里查看解决方案:https://dev59.com/dG025IYBdhLWcg3wZlHd - Cybot
1个回答

0

相对路径在子模块中不起作用。使用 gitolite 存储你的所有存储库。那么你的结构将正常工作。

其他 URL 也会有问题。例如 ..\someotherrepo 或者 \\servername\reponame,甚至是给子模块的像 file:///\\server\... 这样的 URL。


我阅读了gitolite的简短概述,但我没有看到它如何解决我的使用情况。它可以为您处理身份验证和授权,但我并没有遇到那个问题。一个简单的示例或相关文档的指针会很有帮助。 - simon
Gitolite会处理ssh问题并为您提供友好的git网址。在一个小的Ubuntu服务器虚拟机上运行Gitolite对于这个和其他问题非常有帮助。URL变成了gitolite@gitserver:somerepo.git,我在使用子模块和这种形式的URL时没有遇到任何问题。这是我解决同样问题的方法,所以我在这里建议它。我猜你可以等待看看是否还有其他答案出现,或者加入#git irc频道讨论? - Adam Dymitruk

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