Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git DVCS如何构建大型集成代码库,多个项目共享多个通用代码?_Git_Mercurial_Cvs_Dvcs - Fatal编程技术网

Git DVCS如何构建大型集成代码库,多个项目共享多个通用代码?

Git DVCS如何构建大型集成代码库,多个项目共享多个通用代码?,git,mercurial,cvs,dvcs,Git,Mercurial,Cvs,Dvcs,我有一个cvs存储库,其中大部分是java代码。每个包都位于自己的顶级目录中,就像这样,源代码以典型的java方式进行布局 $CVSROOT/my.domain.module1/src/my/domain/module1 $CVSROOT/my.domain.module2/src/my.domain/module2 $CVSROOT/my.domain.share1/src/my/domain/share1 这意味着我们可以编写构建脚本,轻松地从存储库中取出任何包的组合,以构建特定的可交付

我有一个cvs存储库,其中大部分是java代码。每个包都位于自己的顶级目录中,就像这样,源代码以典型的java方式进行布局

$CVSROOT/my.domain.module1/src/my/domain/module1 $CVSROOT/my.domain.module2/src/my.domain/module2 $CVSROOT/my.domain.share1/src/my/domain/share1

这意味着我们可以编写构建脚本,轻松地从存储库中取出任何包的组合,以构建特定的可交付软件

因此,如果我签出my.domain.module1,则该模块中的构建脚本也将拉入my.domain.share1。这确实促进了代码恢复

这种方法有优点也有缺点——目前对此并不感兴趣——只是考虑到这种方法,在mercurial或git中复制是可能的/明智的


据我所知,您需要为每个包定义一个完整的存储库,或者每次签出并提交整个存储库

一般来说,对于DVC,每个组件的回购是正确的大小。由于它们拥有各自组成部分的全部历史记录,因此任何组成部分只有一份回购协议的规模都不太大

Git将使用,汞汞将使用

我们的想法是定义一个超级项目(回购协议本身),它将:

  • 有自己的档案
  • 对于给定的引用,将其自身的一些子目录设置为子模块组件的根目录

如果您直接在其中一个子组件中对主项目进行了一些修改,则必须首先提交这些子repo,然后在主项目中提交该主项目(它不会包含所有数据,只包含它自己的数据,以及指向您之前提交的新子模块引用的一些指针)

听起来你有一个非常好的使用设置。它让您的构建系统处理下拉列表,并针对部分依赖项进行编译,而源代码控制只跟踪模块的时间点

然后,在你的常春藤依赖文件中,你清楚地记录了其他组件所依赖的每个组件的版本,并且可以轻松地恢复/升级


您也可以使用mercurial sub repos,但我更喜欢使用像ivy这样的良好依赖关系管理器。

您描述ivy的方式是我们采用的方法,但我们采用了自己的ant构建系统(比ivy早了十年)。我遇到的问题是,如果我们想继续采用这种方法,但从cvs转移到新的源代码控制系统,它们似乎并不匹配。当新的源代码管理系统的所有文档都使用了他们与cvs相比的所有新东西,然后忽略了他们扔掉的东西……我不认为这是扔掉的东西。如果集中化工作流最适合您的构建工具,那么您仍然可以使用它。我们将我们的ivy依赖关系链接到来自持续集成服务器(Hudson)的构建,这当然是集中的?啤酒瓶?我想在源代码级别管理它。只要你知道工件中有什么修订,为什么它很重要?想必您已经有了自己的理由,但是在接口和链接级别强制模块iterop确实有助于实现解耦。我们的CI系统为每个提交都构建了工件,因此在该级别上操作不会增加任何延迟,从工件构建可交付的应用程序的问题在于,最终可能会产生过大的jar文件——使用包中的一个类会导致包含整个jar文件——除非您有额外的步骤来解包所有内容并计算出真正的依赖项。让javac在编译时做这件事比较容易。谢谢-我看了Mercurial subrepos文档-担心它们没有完全成熟。Git子模块看起来过于复杂-太容易出错。对于文档来说,我不清楚是否可以在根目录的不同位置拥有相同的子回购。例如,以上面的示例为例,为模块1和模块2共享子回购协议。使用cvs很容易。我想我只是需要进行实验。例如,如果我签出module1,然后通过我的构建文件签出共享1,在为此目的创建的子目录中(比如module1/依赖项),那么我很容易一次性标记module1及其所有依赖项。 $CVSROOT/my.domain.module1/src/my/domain/module1 $CVSROOT/my.domain.module2/src/my.domain/module2 $CVSROOT/my.domain.share1/src/my/domain/share1