Git子模块乱七八糟:如何与不熟悉git的开发人员一起使用git子模块?

时间:2011-10-28 10:28:40

标签: windows git git-submodules

我对使用git的子模块功能感到非常沮丧。要么我仍然没有做对,要么就是因为我没想到这一点。项目情况如下:

Project
  | .git
  | projsrc
  | source (submodule)
  | proj.sln

在此方案中,指向包含所有项目中的公共源数据的另一个存储库。在下也有很多发展,在 projsrc 下也是如此。不幸的是,项目指向源子模块的某些提交,而不是它的实际HEAD。这是通常的git行为,据我所知。

我已经发现了

git submodule update

获取与主项目一起提交的子模块版本。但是,我真的希望始终与子模块开发保持同步,但是没有任何真正的线索如何做到这一点。因此我的问题是:

是否可以将项目附加到子模块的HEAD, 如果这会破坏Project的编译,则无论如何都是如此。 我只是不想总是进入子模块 目录并在那里做 git pull 。因为我认为我可以完成我的更改 在子模块目录中,因为这是简单的附加到一个 提交,而不是真正的任何分支左右。

请考虑以下约束

  • 我们小组的开发人员并不熟悉所有VCS。我们之前习惯使用非常庞大的svn存储库,而根本没有任何外部存储库功能。
  • 我们正在开发Windows
  • 点击'n'忘记解决方案是最好的,因为大多数项目成员都使用命令行界面而感到害怕:)

3 个答案:

答案 0 :(得分:8)

子模块指向特定修订的原因很重要。如果您指向HEAD,则构建将不可重现。即如果您查看昨天的项目版本,您永远不会知道昨天源@HEAD的确切版本。

这就是为什么它总是存储特定版本sha。

要提取所有子模块,您可以使用Easy way pull latest of all submodules

答案 1 :(得分:2)

我不擅长Git和子模块。但我认为一些简单的规则会非常有用。

  1. 从子目录提交和推送。
  2. 返回项目的根目录,检查状态是否需要提交并再次推送。
  3. 拉的时候。可以尝试使用脚本将“pull / submodule update”捆绑在一起。并且只在项目的根部进行。

答案 2 :(得分:2)

考虑一下:

  1. source指向HEAD(正如您所希望的那样)。
  2. 您对项目内的源进行了更改(您提交但不推送它们)
  3. 现在您有两个HEAD:一个在Project的源代码中,另一个在您的公共源代码中。
  4. 进行子模块更新时,您希望在项目中出现哪一个?

    在您的情况下,git的问题(和主要特性)是您认为提交和推送为原子操作。事实并非如此。 Git是分散的。没有共同的HEAD。您可能有多个具有不同HEAD的存储库。

    考虑一下:

    1. 你有3个开发人员(A,B和C)和一个git项目。
    2. 他们都拉了一个项目的HEAD。
    3. 每个开发人员都对项目进行了更改
    4. 现在他们每个人都有3个HEADS:A HEAD,B HEAD和C HEAD。
    5. 你认为哪个HEAD是“真正的”HEAD?

      所以,回答你的问题:如果你想让公共源子模块始终与中央存储库同步,那么git不是你的选择。也许没有一个VCS可以帮助你。

      您应该将git子模块视为第三方库,应该使用以下两个步骤手动更新:

      1. 拉您的子模块(“下载第三方库”)
      2. 使用更新的子模块提交项目(“将新版本的第三方库放置到您的项目中”)
      3. 如果要对子模块进行更改,则应按相反顺序执行相同的操作:

        1. 提交您的子模块(“对第三方库进行更改”)
        2. 推送您的子模块(“将您的更改发送给第三方库维护者”)
        3. 使用更新的子模块提交项目(“将新版本的第三方库放置到您的项目中”)