Windows Git子模块混乱:如何在不熟悉Git的开发人员中使用Git子模块?
我对使用git的子模块特性感到非常失望。要么我还是没弄好,要么就是没能像我期待的那样工作。给出了以下项目情况:Windows Git子模块混乱:如何在不熟悉Git的开发人员中使用Git子模块?,windows,git,git-submodules,Windows,Git,Git Submodules,我对使用git的子模块特性感到非常失望。要么我还是没弄好,要么就是没能像我期待的那样工作。给出了以下项目情况: Project | .git | projsrc | source (submodule) | proj.sln 在这个场景中,source指向另一个存储库,其中包含我们所有项目中的公共源数据。在source下以及在projsrc下都有很多发展。不幸的是,项目指向源子模块的某些提交,而不是它的实际头。据我所知,这是git通常的行为 我已经发现了 git submodu
Project
| .git
| projsrc
| source (submodule)
| proj.sln
在这个场景中,source指向另一个存储库,其中包含我们所有项目中的公共源数据。在source下以及在projsrc下都有很多发展。不幸的是,项目指向源子模块的某些提交,而不是它的实际头。据我所知,这是git通常的行为
我已经发现了
git submodule update
只需获取与主项目一起提交的子模块版本。然而,我真的很想始终跟上子模块的开发,但没有任何真正的线索如何正确地做到这一点。因此,我的问题是:
是否可以将项目连接到子模块的头部,
不管这是否会破坏项目的编制。
我只是不想总是进入子模块
目录并在那里进行git拉取。因为我认为我可以放弃我的改变 在子模块目录中,因为这是简单的附加到 提交,而不是真的提交给任何分支
<强>请考虑以下约束< /强>:
- 我们团队中的开发人员并不熟悉周围所有的风投。我们以前习惯于使用非常庞大的svn存储库,根本没有任何外部回购功能
- 我们正在开发Windows
- 单击“不”忘记解决方案是最好的,因为大多数项目成员对使用命令行界面感到非常害怕:)
- 从子目录提交和推送李>
- 返回到项目的根目录,如果需要提交并再次推送,请检查状态 什么时候拉。可以尝试使用脚本将“拉/子模块更新”捆绑在一起。并且只在项目的根目录下进行 考虑一下:
- 源指向头部(如您所愿)
- 在项目内部对源代码进行更改(提交但不推送)
- 现在您有两个头部:一个在项目的源代码中,另一个在公共源代码中李> 在进行子模块更新时,您希望在项目中出现哪一个 在你的例子中,GIT的问题(和主要特征)是你认为提交和推动是原子操作。事实并非如此。Git是分散的。没有共同的头脑。您可能有多个具有不同头的存储库 考虑这一点:
- 您有3个开发人员(A、B和C)负责一个git项目
- 他们都是一个项目的负责人
- 每个开发人员都对项目进行了更改
- 现在他们每个人都有三个头:A头,B头和C头 你认为哪个头是“真”头?< / P > 所以,为了回答您的问题:如果您希望公共源代码子模块始终与中央存储库同步,那么git不是您的选择。可能没有一个VCS会帮你 您应将git子模块视为第三方库,应通过以下两个步骤手动更新:
- 拉动您的子模块(“下载第三方库”)
- 使用更新的子模块提交项目(“将新版本的第三方库放入项目”) 如果要对子模块进行更改,应按相反顺序进行更改:
- 提交子模块(“对第三方库进行更改”)
- 推送子模块(“将更改发送给第三方库维护人员”)
- 使用更新的子模块提交项目(“将新版本的第三方库放入项目”)
- 子模块指向特定版本的原因很重要。如果您指向头部,则生成将不可生成。也就是说,如果你签出昨天的某个版本的项目,你将永远不知道该项目的确切版本source@HEAD那是昨天
这就是它总是存储特定版本的原因
要拉取所有子模块,您可以使用我不擅长Git和子模块。但我认为一些简单的规则会很有帮助
我完全同意他们会分手,但我同意这种情况。我只是费心向每一个在我的项目上合作的非git熟悉的开发人员解释,子模块源代码并不像他们期望的那样工作。他们总是在源代码上提交/推送任何更改。更重要的是,如果他们只是在项目中更新git子模块,他们会丢失对源代码所做的所有更改,因为它们会被特定版本覆盖。
submoduleupdate
不会删除任何更改,正如我所知,它只是签出引用的版本。所做的更改仍在repo中,您可以签出它们,然后更新Project以引用修订,并将子模块修订引用提交到主项目。实际上,如果您尚未提交并推送更改(也未推送父项目中的更改),git会删除您的更改。由于源/是具有分离头的子模块(默认行为),git子模块更新将始终使源/目录处于父存储库所指示的状态。在我看来,这是git非常糟糕的行为,因为它甚至不会通知我本地更改被覆盖(git 1.7.7),如果更改未提交,子模块更新
不会更改任何内容(至少在我的pc上是这样)。如果更改被提交,它们不会丢失,即使您签出了其他内容,也可以签出它们。此外,调用子模块更新的目的是什么?您仍然可以将cd刻录到源代码并进行签出。此外,若您将更改提交到源代码,则需要将它们推送到源代码。您应该将源视为简单的Git存储库,嵌套到PurrSrC中。它是什么