繁体   English   中英

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

[英]Git submodule mess: how to use git submodules with developers not familiar with git?

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

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

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

我已经发现了

git submodule update

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

是否可以将项目附加到子模块的HEAD,不管这是否会破坏项目的编译。 我只是不想总是进入子模块目录并执行git pull 因为我认为我可以放弃在子模块目录中完成的更改,因为这很简单地附加到提交而不是真正的任何分支左右。

请考虑以下限制

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

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

这就是为什么它总是存储特定的修订版sha。

要拉动所有子模块,您可以使用Easy way pull最新的所有子模块

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

  1. 从子目录提交和推送。
  2. 返回项目的根目录,检查状态是否需要提交并再次推送。

当拉。 可以尝试使用脚本将“pull / submodule update”捆绑在一起。 并且只在项目的根部进行。

考虑一下:

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

进行子模块更新时,您希望在项目中出现哪一个?

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

考虑一下:

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

哪个HEAD你认为“真正的”HEAD?

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

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

  1. 拉你的子模块(“下载第三方库”)
  2. 使用更新的子模块提交项目(“将新版本的第三方库放入项目中”)

如果要对子模块进行更改,则应按相反顺序执行相同操作:

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

暂无
暂无

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

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