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

Chr*_*ell 10 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
Run Code Online (Sandbox Code Playgroud)

这非常有效:

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

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

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

所以我的问题如下:

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

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

Rud*_*udi 4

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

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

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

编辑

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