git 中子模塊的使用

一個軟件項目一般由許多模塊構成,這些模塊很多並不從頭進行開發,而是選擇使用開源的項目。

你可以在 github 中搜索符合需要的項目,然後將項目代碼或相關文件放到工程中,這樣做的話當使用的項目更新後你又需要重複添加新的文件到工程中,既不便於管理又常常會造成很多令人困擾的問題。

爲了方便開發者在自己的項目中使用其它項目的代碼或相關文件,git 中提供了子模塊功能。在你的項目中需要使用到的其它項目都可以通過創建子模塊的方式來添加,這樣既可以方便的跟蹤項目更新,也更利於管理自己的項目。子模塊讓開發者不用直接承受管理子項目的壓力,開發者成爲了一個間接的引用者,更多的時間與精力能夠用在其它功能的實現上。

既然已經有了這樣的功能可以用,那麼這個功能該如何使用呢?下面便是我的一些經驗之談。

1.添加一個子模塊

添加一個子模塊意味着你需要在項目中保存外部項目的信息,例如名稱、地址等。這些必要的信息描述了一個外部項目,你的項目通過這些信息與外部項目建立聯繫。

添加一個子模塊你首先需要切換目錄到本地的 git 項目中。然後執行下面的步驟:

1. git submodule add
[longyu@debian:17:59:12] test $ git submodule add  https://github.com/longyuwlz/awtk_slider_circle.git awtk_slider_circle
正克隆到 'awtk_slider_circle'...
remote: Enumerating objects: 123, done.
remote: Counting objects: 100% (123/123), done.
remote: Compressing objects: 100% (83/83), done.
remote: Total 123 (delta 36), reused 119 (delta 32), pack-reused 0
接收對象中: 100% (123/123), 1.58 MiB | 364.00 KiB/s, 完成.
處理 delta 中: 100% (36/36), 完成.
檢查連接... 完成。

執行 git status 命令有如下輸出:

[longyu@debian:18:00:45] test $ git status
位於分支 master
要提交的變更:
  (使用 "git reset HEAD <file>..." 撤出暫存區)

	新文件:   .gitmodules
	新文件:   awtk_slider_circle

子項目已經從遠端克隆到了本地,同時本地新建了 .gitmodules 文件,文件中保存着描述子模塊的信息。這裏我們可以查看下 .gitmodules 的內容。

[longyu@debian:18:01:02] test $ cat .gitmodules
[submodule "awtk_slider_circle"]
	path = awtk_slider_circle
	url = https://github.com/longyuwlz/awtk_slider_circle.git

第一行中描述子模塊名稱,第二行的 path 表示克隆到子項目的路徑,第三行表示項目的地址。

2. git commit

添加了子模塊之後,我們需要提交更改到項目中。示例如下:

[longyu@debian:18:00:47] test $ git commit -m "add awtk_slider_circle as submodule"
[master 85d81e4] add awtk_slider_circle as submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 awtk_slider_circle

注意第一行輸出說明了當前使用的分支及 commit 的 hash 值,這裏使用的分支是 master ,你也可以使用其它分支上的 commit ,只需要在 commit 之前切換到相應分支即可。

2. 刪除一個子模塊

刪除一個子模塊並不常用,刪除操作相較添加也更爲繁瑣。在 git 的子模塊幫助手冊中對刪除子模塊操作的步驟描述如下:

  1. 從 .gitmodules 文件中刪除相關的子模塊描述信息
  2. 從 .git/config 中刪除關聯部分
  3. 執行 git rm --cached path_to_submodule(不要在子模塊路徑前後添加斜槓)
  4. 提交變更到最外層項目中
  5. 刪除所有未追蹤的子模塊文件

注意 .gitmodules 這個文件在上文中已經描述過了,.git/config 文件卻還沒有提及。如果我們使用一個文本編輯器打開此文件,我們會發現其中有對分支與子模塊的描述。我們不需要看分支相關行,只需要刪除與待刪除子模塊有關的行即可。這一刪除操作可以通過文本編輯器來操作,但並不推薦這種方式。最好使用 git 移除配置的命令來完成,這樣可以最大程度避免人爲遺漏的問題。這裏使用的命令如下:

git config -f .git/config --remove-section submodule.submodulename
git config -f .gitmodules --remove-section submodule.submodulename

當本地項目中子模塊未初始化時,.git/config 沒有與對應子模塊相關的信息,這樣執行移除其中與子模塊相關的內容會報 No such section! 的錯誤,這裏直接執行後續操作即可。

我按照上面的方式操作,結果發現在執行第三步時會報錯,報錯信息如下:

fatal: 請將您的修改緩存到 .gitmodules 中或保存進度後再繼續

這個報錯信息表明我應當提交當前的修改。我查看倉庫狀態,發現需要提交對 .gitmodules 的修改。提交之後,重新執行第三步中的命令,執行成功。

最後請注意最後一步刪除的文件中還應該包含 .git/submodules 文件夾下的相關內容,不過如果未初始化且沒有拉取子模塊到本地,這個文件夾下一般是沒有東西的,直接忽略即可!

3.克隆帶有一個有子模塊的項目

克隆帶有一個子模塊的項目大致可以按照子模塊拉取的時間劃分爲兩類。

第一類是在克隆項目的同時也遞歸的克隆子模塊,第二類是先克隆項目,成功後再執行命令拉取子模塊。

這裏需要注意,子模塊中可能仍舊會包含其它的子模塊,因此這裏的拉取操作應該是遞歸的,這樣才能保證成功拉取到所有依賴的子模塊。相關操作如下:

1.克隆項目的同時遞歸克隆子模塊
git clone --recursive project_path
2.克隆項目成功後再拉取子模塊
git clone repository
cd project_path
git submodule update --init --recursive

git 中子模塊的常見操作到這裏便敘述的七七八八,更詳細的信息請參考 manual。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章