如何设置一个git结构,其中一个子模块需要在其下面安装外部库?

3
我正在使用git,我的项目(MyProject)作为子模块添加了一个托管在github上的公共git项目(SubProject)到其目录结构中。 SubProject需要包含一个库(SomeLibrary)在其目录结构下。
现在这很糟糕,因为如果不是SubProject要求SomeLibrary在其下面,这将非常简单。因为我已经将SubProject作为MyProject的子模块添加了进来,所以没有更多需要做的事情。然而,需要SomeLibrary,而且它没有托管在任何git存储库中。所以我会创建一个新的存储库,并使用其版本号进行标记。但是,如何最好地将它们全部绑定在一起呢?
一旦SomeLibrary在我为其创建的git存储库中,我可以将SomeLibrary作为MyProject的子模块添加进来,还是必须将其作为SubProject的子模块?如果它是SubProject的子模块,那么知道我可能需要随着时间的推移升级SubProject的新标记发布,最好的方法是什么?一个工作流示例真的会帮助我理解,因为我很难想象它会是什么样子。(例如:在做任何事情之前,我是否需要分支SubProject,或者那不是必要的,意味着我只需提取SomeLibrary并提交...)
1个回答

0
如果您正在使用某种构建系统(如make、maven、ant、MSBuild等),或许可以通过将库放置在父git存储库的某个位置,并在构建时让构建系统将库复制到子模块中来绕过整个问题。
否则,您可能需要在子模块中创建一个分支,添加库并提交,然后在父存储库中提交子模块更改。每当子模块作者产生更新时,您必须将其拉入您的分支(从而获得更新并保留库),并在父存储库中进行提交。然而,如果您想在其他计算机上克隆父git存储库并获取正确的子模块内容,则必须将此子模块分支推送到您控制的某个位置(例如,项目的自己的github分支)。因此,子模块将需要两个远程:原始的github项目(用于从作者那里拉取更新)和您的github分支(用于将作者的更新与您的库分支合并后推送)。

不使用构建系统。 所以在您的第一个选择中,分支的目的是什么-我不能只在主分支中做这些提交,然后继续从公共存储库中拉取更新吗?在您的第二个选项中,您能描述一下您所说的我的项目的独立版本吗? 我应该描述我的本地存储库将连接到我们共享但内部存储库。那么,我的子模块是否只能有1个远程,即共享存储库 - 我会向其推送,并且共享存储库中的子模块将有1个远程,即公共存储库,并且会从中拉取...这样会起作用吗? - user779159
@user779159:当然,你可以留在主分支上;但是,在我看来,创建一个新的分支会更正确,因为你实际上并不打算将你的更改最终合并到你克隆的开源存储库中。你所描述的方法,只将内部存储库作为本地远程,而将github作为内部存储库的远程,应该是可行的。 - Aasmund Eldhuset

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