2017-04-04 500 views
1

我花了大量時間閱讀和嘗試git子模塊。但我真的放棄了。Git Submodule:無法將子模塊更新到較早版本

我的問題:

我克隆一個Git倉庫的子模塊。所以,我做

git submodule add -b master url localpath 

存儲庫開始下載並在.gitmodules文件中進行相應的條目。 git子模塊狀態顯示最新的提交。

到目前爲止這麼好。

在開發過程中,發現子模塊中的HEAD提交有一個bug。所以,提交應該從主更改爲一些提交ID。

所以,我在.gitmodule文件更改提交ID(7 aplhanumeric)從分支=主

branch = <commitid> -> .gitmodule file 

,也

git submodule update --remote 

的錯誤是

致命的:需要單個修訂版

無法找到子模塊路徑當前原點/修訂

我也試過

git submodule foreach git pull 

,這樣它會拉動提交ID,但它只是與

進入name_of_the_submodule

返回

已經是最新的。

任何人都可以幫我嗎?

P.S:我已經經歷了很多教程和問題和答案。所以如果你想爲了好玩而低估這個,那麼請先指出一個答案,我會刪除這篇文章。

回答

1

您已經克隆子模塊後,在你的問題描述:

git submodule add -b master url localpath 

那麼你應該能夠changedir子模塊:

cd localpath 

一旦輔助模塊,你可以使用任何git命令,它們只會影響子模塊的回購。例如,您可以檢出該神聖的分支或修訂版:

git checkout <branch|tag|hash> 

或籤第二個到最後的主分支修訂:

git checkout HEAD~1 

然後changedir回主混帳回購協議:

cd .. 

而且git status應該產生這樣的:

On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    new file: .gitmodules 
    new file: localpath 

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: localpath (new commits) 

然後,只需添加改變做你的子模塊:

git add localpath 

,並承諾

git commit -m "Add submodule url to localpath with older working commit" 
+0

明白了!有幾個教程指的是用來改變你的.gitmodule文件。他們都失敗了,因此混亂。最簡單的方法是克隆整個分支(不管提交ID如何),然後在所需提交ID的子模塊中執行git checkout,然後在父分支中執行git commit,然後推送。 – infoclogged

+0

還有一件事。其他已經下載完整代碼(包括子模塊)的開發人員需要調用git pull,然後調用git submodule update或git submodule update --remote以與最新的子模塊更改同步。 – infoclogged

+0

是的,每次更改子模塊引用時,在父回購庫上執行'git pull'時,子模塊將顯示爲'modified'。要將子模塊更新爲新引用,只需在主要的回購庫上運行'git submodule update'即可。 –

0

我回答我的問題,研究一點點後,可能會有所幫助給其他人:

理解git子模塊是一件很痛苦的事情,但一旦你明白了,一切都開始有意義了!

以下後顯示:

  • 添加子模塊,讓別人用你的子模塊同步。
  • 更新子模塊並讓其他人與您的子模塊同步。
  • 刪除子模塊並讓其他子模塊同步。
  • 更新已移除的子模塊。

添加子模塊

git的子模塊添加-b

在.gitmodules(名稱,路徑,網址,分支)下載由

git submodule update --init 

這各子模塊的入口有三個重要的事情,其中​​前兩個對用戶隱藏:

  1. 更新的.git /配置一個額外的條目(子模塊)

  2. 下載下的.git /模塊裸形式的儲存庫。這意味着,.git中有.git。

  3. 將.git/modules中的git子模塊檢出到父目錄中。現在

,第2天,在commiter,誰COMMITED子模塊實現,他應該改變子模塊其他一些承諾,而不是HEAD。所以,他會去他的本地倉庫,然後去子模塊路徑,然後簽了承諾,他希望通過簡單地調用

git checkout <hash> 
cd <parent dir> 
git submodule status 

在這一點上,git的子模塊的狀態仍然沒有顯示新的哈希值。新的散列只有在更改進行時纔可見。現在,提交者只需要執行(添加),提交和推送更改,以便所有其他開發人員都可以看到它。

更新添加子模塊

在第3天,其他開發人員,將僅通過調用命令

git pull # this is to get the latest commit of the parent git repository. 
git submodule update --force # update the submodule with latest hash 

基本上更新自己的倉庫,這裏的要點很簡單:子模塊不直到並且除非被告知這麼做。只要做git拉,不會更新git子模塊。開發人員可以繼續在本地子模塊上工作,而不會將其同步到「永久」服務器上。子模塊更新會在顯式調用git子模塊更新命令時發生。

刪除子模塊

現在,在第四天的提交者,決定徹底刪除git的子模塊。這裏的步驟也不簡單,因爲沒有任何東西叫做git submodule rm,它應該已經相當於git submodule add。這隻能做且僅當下面的順序如下:

git submodule deinit submodulename 
  1. 這將刪除的.git/config條目。

  2. 這將清除子模塊目錄!在此命令之後,您將在submdoule目錄中看到任何內容。

  3. 但是,子模塊的內容仍在git的可用/模塊

因此混帳狀態-u這裏仍然會顯示Everyting是高達日期!

所以顯示清除,

git rm submodulepath 

此時git的狀態將返回.gitmodules已經改變(子模塊已被刪除)和子模塊路徑已被刪除。提交併推送更改。

去掉子模塊

在第五天更新,開發商要刪除的子模塊「自動」喜歡用git子模塊的更新一樣。所以他們先做一個混帳拉,這成功地刪除所有指標到GIT子模塊

git submodule status # shows nothing 

,但.git的/ config中仍然包含有效的子模塊條目和子模塊文件夾有與它的所有內容和純倉庫在.git/submodules下!沒有命令可以刪除它們。所有這些都必須通過手工明確刪除。(請糾正我,如果我錯了)