分支上的Git子模块

分支上的Git子模块,git,git-submodules,Git,Git Submodules,我有一个托管在Bitbucket上的iOS项目,它使用MapBox iOS sdk,我将其合并为git子模块。提交跟踪在开发分支上,而不是发布分支上。比如说,几次之后,当我试图从Bitbucket上重新克隆我的项目时(通过git clone--recursive)。而且我也喜欢我使用的子模块MapBox iOS sdk能够从MapBox更新到最新版本。所以我想拉。但首先它是一个“无分支”,所以我进入了我自己项目的MapBox iOS sdk目录,并做了一个 git签出-b开发远程/源站/开发 它

我有一个托管在Bitbucket上的iOS项目,它使用MapBox iOS sdk,我将其合并为git子模块。提交跟踪在开发分支上,而不是发布分支上。比如说,几次之后,当我试图从Bitbucket上重新克隆我的项目时(通过git clone--recursive)。而且我也喜欢我使用的子模块MapBox iOS sdk能够从MapBox更新到最新版本。所以我想拉。但首先它是一个“无分支”,所以我进入了我自己项目的MapBox iOS sdk目录,并做了一个

git签出-b开发远程/源站/开发

它给了我输出:

M   MapView/Map/SMCalloutView Previous HEAD position was 6c6be52... closes #148: incorporate @tmalloy's RMShape bezier curve enhancements
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
然后,我做了一个
git pull
,它告诉我我已经是最新的了。在这一点上,我的第一个问题是:我是否已经从Mapbox开发分支提交了最新的内容

此时,我在Mapbox iOS sdk目录中键入
git status
,得到以下结果:

git status
# On branch develop
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   MapView/Map/SMCalloutView (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
git状态
#论分支机构的发展
#未为提交而暂存的更改:
#(使用“git add…”更新将提交的内容)
#(使用“git签出--…”放弃工作目录中的更改)
#
#修改:MapView/Map/SMCalloutView(新提交)
#
未向提交添加任何更改(使用“git add”和/或“git commit-a”)
这是我的第二个问题:这到底意味着什么?无论如何,我并没有试图修改mapbox ios sdk,我只想使用一个官方版本,但为什么它要我提交?如果我真的提交了,在我看来,我将修改一个新版本的Mapbox sdk,然后在我自己的项目上,我将标记这个特定的提交,它不在官方来源上。我的同事试图拉我的项目,但由于找不到提交,难道不会有问题吗

编辑: SMCalloutView是Mapbox sdk本身合并的git子模块

编辑2: 所有命令都是在pwd位于Mapbox ios sdk基本目录(我的项目的子目录)时发出的

编辑3:
项目位于
MapView/Map/SMCalloutView
MapBox iOS sdk
子模块的子模块,因此您具有嵌套依赖项。正是这个嵌套依赖项更新了

如果这些更正和更新对您的项目很重要,您将需要递归地更新子模块,以确保您拥有所有更新

然后,您需要决定是否/如何将这些依赖项的更正作为超级项目的一部分,因为这将产生同步问题

如果您只是使用一个特定的版本,并且偶尔更改为一个更新的发布版本,那么递归更新就不再困难(可能更容易,请参阅手册;-)

如果你也在纠正问题,你会遇到一个非常棘手的问题,即同时出现在两个地方——a)使用已发布的版本,b)使用你自己的已纠正版本,并尝试在后面将这两个版本连接起来


考虑制作您自己的fork并在fork处重新启动子模块,以允许您在同一公共repo中拥有这两个变体,并添加回上游repo。但是您必须使用这两个变体来维护fork…

我认为
MapView/Map/SMCalloutView
MapBox iOS sdk
子模块的一个子模块,并且您有一个嵌套的依赖项。正是这个嵌套依赖项更新了。
MapView/Map/SMCalloutView
是嵌套子模块吗?我不确定什么是嵌套子模块。但它是Mapbox SDK的子模块,我只直接将Mapbox ios SDK作为项目的子模块。但我个人并没有将SMCalloutView添加为我自己项目的子模块。这个项目实际上是为了演示一些感知到的MapBox sdk错误,以便您可以实际查看:我有另一个项目也使用MapBox sdk,我必须在github维护我自己的sdk分支。但这个简单的案子已经把我绊倒了。你是说,当我进行递归克隆时,我已经设法获取了比Mapbox sdk develop分支当前使用的版本更新的SMCalloutView版本吗?或者,当我进行克隆时,可能没有,但当我用checkout-b签出它时,仍然存在相同的问题。当您签出
remotes/origin/develope
时,您将使用的特定版本(及其特定嵌套子模块)切换到最新版本(子模块,但不是其嵌套子模块)。这让你处于一种不确定的状态,你没有处于任何已知的良好状态。要达到(新的)已知良好状态,需要更新子模块的子模块。或者回到旧的状态(特定提交)。我使用的特定版本也是remotes/origin/develop的一部分,只是它是分支的旧提交。如何获取我签出的子模块版本所使用的嵌套子模块的版本?在
MapView/Map/SMCalloutView
中,需要使用
submodule update--recursive
(查看手册)将其升级到其子模块的发布版本,因此,当您在超级项目中添加并提交它时,您正在使用完整的发布版本。“获取”子模块需要一段时间。