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

时间:2010-10-21 23:08:36

标签: svn git 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? :)

1 个答案:

答案 0 :(得分:4)

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

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

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

修改

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