1. 程式人生 > 程式設計 >詳解git submodule update獲取不到最新提交的程式碼

詳解git submodule update獲取不到最新提交的程式碼

今天遇到了一個git submodule update獲取不到最新程式碼的問題,鬧了半天原來是自己對git submodule理解不到位引起的。解決了後,感覺雖然沒有什麼高深的地方,但是不清楚的時候還是需要費時間去查詢問題,所以還是在此記錄如下。

1.問題描述

同事在共同使用的一個工程裡修改了程式碼,這個工程在我本地的工程中是作為submodule來使用的,但是我在本地執行以下命令卻獲取不到最新提交的程式碼。

git submodule update --init --recursive

2.問題原因

git submodule在工程中維護了一個檔案.gitmodules檔案,裡邊記錄了子工程在當前父工程下的存放路徑path和子工程的git路徑url。同時,在父工程下的.git目錄中,還有個modules子目錄如下所示。

詳解git submodule update獲取不到最新提交的程式碼

在這個modules中存放的就是父工程相關的子工程的路徑。進入子工程後,可以看到裡邊有個叫做FETCH_HEAD的檔案:

詳解git submodule update獲取不到最新提交的程式碼

檢視該檔案的內容如下:

zhuwsh@zhuwsh-TM1705:~/work_space/autonomousDriving/.git/modules/src/utils/dw_xxx_center$ cat FETCH_HEAD

31ecb3458596f22134588460eefb9efa4bd6df23 branch 'master' of https://gitlab.xxx.com/xxx/dw_xxx_center

此時可以發現,這裡的commit id和git上最新提交的commitid不一樣,這裡的commit id還是之前某一次的提交id。

這個其實要說明的是,git submodule update獲取程式碼的時候是和子工程的git路徑和這裡的commit id有關聯的,獲取的就是對應的git路徑下截止這個commit id的所有程式碼,之後的程式碼是不會獲取到的。

明白了這個原理後,就知道怎麼來修改了。

3.解決方法

既然git遠端伺服器程式碼已經修改過了,那麼本地每次執行了git submodule update --init --recursive命令後自然需要在自工程對應的路徑下執行git pull命令,執行完後伺服器端的最新程式碼就更新到本地了。這個操作做完後再執行git submodule update命令,此時就可以看到上邊說的FETCH_HEAD檔案中的commit id發生了變化,已經變為當前最新的commit id了。

zhuwsh@zhuwsh-TM1705:~/work_space/autonomousDriving/.git/modules/src/utils/dw_xxx_center$ cat FETCH_HEAD

ab214ead574d51755f4faabad4045de6486b49c2 branch 'master' of https://gitlab.xxx.com/xxx/dw_xxx_center

總結一下就是,在使用git submodule update --init --recursive獲取了自工程程式碼後,還需要執行下面兩條命令:

git pull
git submodule update

到此這篇關於詳解git submodule update獲取不到最新提交的程式碼的文章就介紹到這了,更多相關git submodule update最新提交內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!