繁体   English   中英

如何使我的svn:externals策略适应git子模块?

[英]How do I adapt my svn:externals strategy to git submodules?

我无法弄清楚如何将我的心态转变为git并遇到以下问题。 我遇到的情况是我们有一个共享引擎和多个使用该引擎的项目。 内部开发团队和第二方团队可能正在处理使用共享引擎的项目,并希望在开发期间尽可能多地使用共享引擎的HEAD,直到发布前几周,共享引擎将被标记并且分支,然后项目将使用该分支。 项目团队通常一次只能处理一个项目,但可以在调试期间对共享引擎进行更改或添加功能。 当他们提交这些更改时,我们的构建系统会运行以查找他们可能在提交时引入的任何问题。

我(我想)想要将这个模型与新项目/新公司一起使用。 在svn中,结构是这样的:shared_engine

project_in_dev-+
               +- svn:external shared_engine:head
project_about_to_ship-+
                      +-svn:external shared_engine_rev1_branch

这非常有效:

  • 项目开发人员可以执行一个命令来检查他们需要的所有依赖项
  • 项目开发人员可以轻松完成引擎工作并提交到共享引擎
  • 我们可以轻松地修改或更改项目使用的共享引擎与外部和修订
  • 您每日“从根项目更新”很容易获得引擎更新

好的,现在我已经转移到git,并且子模块SEEM是处理外部代码的新方法,但似乎我失去了一些功能。

  • 实际获取项目的所有依赖项是一个多步骤的过程。 项目开发人员必须做一个git clone然后一个git子模块init / git子模块更新--recursive
  • 这是更新根项目和子模块的多步骤过程,因此如果另一个开发人员对子模块的更改与子模块进行了更改,则不会立即获得匹配的代码,并且可能会非常混淆
  • 子模块被锁定到特定的提交,如果你对子模块进行了更改,你将无法使它与共享引擎的头部一起工作
  • 我无法控制项目开发人员检查过的共享引擎的修订版,而没有提供更新内容的说明

所以我的问题如下:

  • 首先,关于子模块的上述假设是否正确? 它似乎是基于我所读到的,但我不是百分之百确定,因为我还在搞清楚git
  • 如果我的假设是正确的,我是否正确处理问题? 使用git时是否需要重新调整我的想法? 换句话说,还有另一种方法可以做我想做的事情,需要以不同的方式思考这个过程吗?
  • 假设我没有吹过前两个,子模块不会做我想要的,会是什么? 我读到了关于子树的合并,但那些看起来并不完全正确,因为看起来我无法将共享代码的更改重新放回到存储库中。

非常感谢您的帮助和耐心。 如果不是很明显,我对git很新,我喜欢它并希望拥抱它,但我仍然有一些概念上的误解,因为我可能因多年使用中央回购而受到脑损伤。 我想学习! 此外,我整天都在rtfm'ing,并查看各种博客文章,stackoverflow问题等,我仍然没有得到它,我显然需要逐步说明我的情况。 我没有同事可以询问这一点,西雅图地区的任何用户群可能都有一些git guru? :)

你是对的,子模块总是引用一个特定的修订版本,当你git add子模块目录时就修复了这个版本(因此你可以准确地控制在开发人员框中检出的内容)。 但我认为这是一个功能,因为您可以在需要时始终请求子模块的HEAD。 另一方面,这意味着当您检查项目的旧状态时,无论子模块中发生什么变化,您总是会获得相同的状态。 您可以将它们视为固定到特定版本的svn外部。

至于子模块中的更改,它们只是普通的git repos,您可以在其中使用正常的工作流程,就好像它们克隆到自己的工作副本中一样。 常规克隆有一个区别,即子模块的检出很可能是一个分离的头,所以当你在那里进行更改时,你必须自己创建一个分支。

对于许多命令部分,是的,需要做更多的工作,这是为这个功能付出的代价。 如果存在许多子模块,您可以添加执行子模块检出的脚本。

编辑

我找到了关于子模块的详细说明: http//longair.net/blog/2010/06/02/git-submodules-explained/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM