今天遇到了一個git submodule update獲取不到最新代碼的問題,鬧了半天原來是自己對git submodule理解不到位引起的。解決了后,感覺雖然沒有什么高深的地方,但是不清楚的時候還是需要費時間去查找問題,所以還是在此記錄如下。
1.問題描述
同事在共同使用的一個工程里修改了代碼,這個工程在我本地的工程中是作為submodule來使用的,但是我在本地執(zhí)行以下命令卻獲取不到最新提交的代碼。
git submodule update --init --recursive
2.問題原因
git submodule在工程中維護了一個文件.gitmodules文件,里邊記錄了子工程在當前父工程下的存放路徑path和子工程的git路徑url。同時,在父工程下的.git目錄中,還有個modules子目錄如下所示。

在這個modules中存放的就是父工程相關(guān)的子工程的路徑。進入子工程后,可以看到里邊有個叫做FETCH_HEAD的文件:

查看該文件的內(nèi)容如下:
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
此時可以發(fā)現(xiàn),這里的commit id和git上最新提交的commitid不一樣,這里的commit id還是之前某一次的提交id。
這個其實要說明的是,git submodule update獲取代碼的時候是和子工程的git路徑和這里的commit id有關(guān)聯(lián)的,獲取的就是對應(yīng)的git路徑下截止這個commit id的所有代碼,之后的代碼是不會獲取到的。
明白了這個原理后,就知道怎么來修改了。
3.解決方法
既然git遠端服務(wù)器代碼已經(jīng)修改過了,那么本地每次執(zhí)行了git submodule update --init --recursive命令后自然需要在自工程對應(yīng)的路徑下執(zhí)行g(shù)it pull命令,執(zhí)行完后服務(wù)器端的最新代碼就更新到本地了。這個操作做完后再執(zhí)行g(shù)it submodule update命令,此時就可以看到上邊說的FETCH_HEAD文件中的commit id發(fā)生了變化,已經(jīng)變?yōu)楫斍白钚碌腸ommit 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
總結(jié)一下就是,在使用git submodule update --init --recursive獲取了自工程代碼后,還需要執(zhí)行下面兩條命令:
git pull
git submodule update
到此這篇關(guān)于詳解git submodule update獲取不到最新提交的代碼的文章就介紹到這了,更多相關(guān)git submodule update最新提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Git Submodule管理項目子模塊的使用
- 詳解git submodule使用以及注意事項
- git中submodule子模塊的添加、使用和刪除的示例代碼
- Git Submodule使用完整教程(小結(jié))