2013-06-19 160 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