2011-04-04 180 views
183

我已經在我的天真,成立了一個git子模塊和對待它像一個顛覆外部 - 即它現在充滿了我剛剛意識到還沒有提交或任何推的變化。如何在git子模塊中「提交」更改?

有一些簡單的方法來提交/推子模塊更改回上游回購? Git推薦的技術是以這種方式在單獨的(但是鏈接的)存儲庫上同時進行開發?

+2

注意:http://stackoverflow.com/questions/3131912/why-are-git-submodules-incompatible-with-svn-externals/3132221#3132221和http://stackoverflow.com/questions/2879414/git -submodule-svn-external/2879490#2879490可以幫助說明子模塊和外部的區別。 – VonC 2011-04-04 19:03:26

回答

284

子模塊是它自己的回購/工作區,擁有自己的.git目錄。

所以,第一次提交/把你的子模塊的變更:

$ cd path/to/submodule 
$ git add <stuff> 
$ git commit -m "comment" 
$ git push 

然後告訴你的主要項目跟蹤更新版本:

$ cd /main/project 
$ git add path/to/submodule 
$ git commit -m "updated my submodule" 
$ git push 
+7

除了git似乎已經將子模塊放入匿名分支時... $ git.exe b -a *(無分支) – rogerdpack 2011-12-03 02:48:58

+10

@rogerdpack - 你是對的。子模塊通常以「不分支」結束。在添加/提交到子模塊之前,您經常需要檢查一些分支。 – timdev 2011-12-23 16:57:30

+3

即使這被標記爲重複,因爲你的回答比其他的更清楚 – 2013-11-21 20:12:09

4

你可以把一個子模塊完全像一個普通的倉庫。要傳播上游的更改,只需按照通常在該目錄中的方式進行提交和推送。

+0

對我來說這是最好的答案。如果你像其他任何git倉庫一樣對待它,你不需要記住任何新的命令!只是cd到子模塊的目錄和: 'git的添加-A' 'git的承諾-m「一些信息」'' 混帳push' 然後cd到主回購,做同樣的。 – shmim 2015-05-13 03:41:16

+7

...除了我的普通存儲庫沒有分離的磁頭。 – Seth 2016-07-13 23:03:17

2

,然後才能提交和推送,你需要初始化工作庫樹子模塊。 我使用的龜做以下的事情:

首先檢查是否存在git的文件(不是目錄)

  • 如果有這樣的文件,它包含路徑supermodule git的目錄
  • 刪除文件
  • 做的git的init
  • 做混帳添加遠程路徑用於輔助模塊中的一個
  • 後續說明如下

如果有git的文件中,切切實實爲追蹤本地樹.git目錄。 你仍然需要一個分支(你可以創建一個)或切換到主(有時不工作)。 最好做的是 - git fetch - git pull。不要忽略提取。現在

您的提交和拉將與您的起源/主同步

45

請注意,如果你犯了一堆各種子模塊的變化,你可以(或將很快就能)在一個推一切去(即從父回購一個推),具有:

git push --recurse-submodules=on-demand 

git1.7.11([ANNOUNCE] Git 1.7.11.rc1)提到:

git push --recurse-submodules」學會有選擇地考慮子模塊綁定到上層項目的歷史,推動他們。

this patch--on-demand選項後可能做到:

--recurse-submodules=<check|on-demand|no>:: 

確保所有子模塊的提交使用的修訂推可在一個遠程跟蹤分支。

  • 如果使用check,將檢查所有要推送的版本中更改的子模塊提交在遠程可用。
    否則,推送將被中止並以非零狀態退出。
  • 如果使用on-demand,則會推送修訂中要更改的所有子模塊。
    如果按需無法推送所有必需的修訂,它也將被中止並以非零狀態退出。

此選項僅適用於一層嵌套。其他子模塊內子模塊的更改不會被推送。

+0

這不適合我:我必須做的: – rivanov 2017-07-07 00:07:17

+2

'git submodule foreach git push -u origin master' – rivanov 2017-07-07 00:16:46

+0

@rivanov你使用的是什麼版本的Git? – VonC 2017-07-07 04:35:17

3
$ git submodule status --recursive 

在這種情況下也是救命的人。你可以使用它和gitk --all來跟蹤你的sha1,並驗證你的子模塊是指向你認爲他們是。