2013-06-19 91 views
4

我已经分叉了一个MapBox-ios-sdk并对其进行了一些更改。 sdk的更新版本在这里,我将我的更改合并到我的fork中。 MapBox-ios-sdk也包含了SMCalloutView,它是MapBox-ios-sdk中的子模块。然而,官方sdk的版本使用了一个更新的,更新的SMCalloutView,它不在我的分支中。Git子模块新版本更新

我如何得到它更新

我奉here更新我的SDK。但是,这不会更新SMCalloutView。我也在MapBox-ios-sdk的级别上试过git submodule update --recursive,没有任何反应。事实证明,这是因为SMCallOutView处于“无分支”状态。为什么在“没有分支”?我如何使所有子模块脱离“不分支”的状态?如果它位于“无分支”,那么我永远不会知道需要更新的子模块的哪个子模块或子模块(甚至更多嵌套)。

+0

子模块通常是在一个特定的提交,而不是在一个分支的末端,因而有“(无科)”。更新子模块可能会引起混淆 - 这取决于您是否在进行更新,需要提交给超级项目,还是取决于您是否需要更新超级项目并确保子模块已同步(更新)。 –

+0

这听起来像我的情况是最后一个例子,但我不确定你指的是什么超级项目。我正在使用一个开源的github项目作为我自己项目的子模块。我想将最新的open src项目,包括它使用的子模块(标签)到其自身的任何更新,都放到我的项目中。 – huggie

+0

有没有其他的子模块?这件事让我疯狂。但是我使用的开源项目依赖于子模块,尽管转移到CocoaPods(我在iOS上) – huggie

回答

16

随着git 1.8.2+(2013年3月),您可以定义一个子模块,它将反映给定分支的最新提交。
请参阅“git submodule tracking latest”。

这意味着,这将是足够的更新子模块到最新的一个分支:

# --remote will also fetch and ensure that 
# the latest commit from the branch is used 
git submodule update --remote 

更多的--remote选项见git repo commit 06b1ab


要回顾一下:

  • 对于一个新的子模块(必须遵循的一个分支)

    git submodule add -b [branch] [URL] [DirectoryName] 
    
  • 对于现有的子模块,你现在想遵循分支
    另请参阅git repo commit b92892,用于将git子模块转换为跟随分支的子模块。
    所有你需要做的是:

    git config -f .gitmodules submodule.<path>.branch <branch> 
    

    多见于“Git submodules: Specify a branch/tag

+1

太棒了!现在我只需要更新git。这个功能出乎意料地晚了。 :D – huggie

+0

给我自己的一个说明:'git submodule add -b [branch] [URL] [DirectoryName]' – huggie

+0

@huggie我已经在答案中包含了你的注释以提高可见性,并且增加了更多关于如何转换现有的子模块。 – VonC