Git submodule Git子模組簡介

2021-09-29 12:25:59 字數 2626 閱讀 4607

建立倉庫

1.1 建立主倉庫

1.2 建立子倉庫

提交內容

2.1 提交到主工程的倉庫

2.2 提交到子模組的倉庫

轉殖帶子模組的倉庫到本地

更新子倉庫

總結參考文件

軟體開發中有乙個dry(don』t repeat yourself)原則,或者說die(duplication is evil)原則,指的是盡可能減少一切重複工作,重用一切可能重用的東西,小到提取重複性**,大到重用乙個模組。時間就是金錢,效率就是生命。

使用git管理專案的時候,如果涉及到模組重用,比如你需要用到別的倉庫提供的功能,雖然你可以直接把別人倉庫(當然也可以是自己的倉庫)的**複製到你的工程目錄下,但是這樣當別的倉庫更新了,我們也想相應的更新我們所依賴的**,或者我們對依賴的**做了些更改想要合併到原倉庫,這時候事情就比較麻煩了。所以,我們希望主模組和子模組的的管理是分開的,也就是主模組的更改、提交等,是不涉及子模組的,反過來子模組也一樣。但是又希望他們之間有乙個依賴關係,怎麼辦呢?

git為了這種困境提供了乙個解決方案:子模組(submodule)。

為了便於理解,我們把當前工作工程倉庫成為主倉庫,主倉庫所依賴的子模組倉庫成為子倉庫。

建立主倉庫

mkdir demo &&

cd demo &&

git init

建立子倉庫

建立子倉庫用到的命令是git submodule add。其中repo是你要新增為子模組的倉庫url,path是主工程下的乙個路徑,就相當與你在主工程下建立的乙個專門用於儲存子倉庫**的資料夾,名字是任意的,只不過習慣上用third_party利於區分和理解。例如我們將pybind11新增為子模組,其相對路徑為third_party/pybind11,我們可以使用以下命令:

git submodule add  third_party/pybind11
值得注意的是,pybind11這個目錄在在使用命令前是不能存在與third_party目錄之下的。並且,此命令執行完成以後,子倉庫的**就被拉取到third_party/pybind11之中了。

主倉庫和子倉庫之間,除了子倉庫位於主倉庫內,主倉庫對子倉庫的**有所依賴以外,他們之間是沒有其他任何聯絡的。他們呢就相當於兩個倉庫,主倉庫不會跟蹤子倉庫內容的變化,反過來子倉庫也不去跟蹤子倉庫的任何資訊。就類似古代周邊某些附屬小國,雖然名面上朝貢、附屬,但實際上小國的治理和**是分開的。

提交到主工程的倉庫

對主工程內容的提交操作,與一般無子工程的倉庫操作並無二致。

提交到子模組的倉庫

如果有需要對子模組的內容進行修改並提交到其倉庫,可以進入到子模組倉庫所在目錄,再進行相應的操作。例如,我們使用cd third_party/pybind11進入到子模組倉庫,這時候我們可以使用git add, git commit等對更改進行操作,這些操作之對子模組倉庫產生影響。

git clone ***x.git --recurse-submodules
第二種方法是使用下面兩條命令:

git submodule init

git submodule update

git checkout master
更新子倉庫內容有兩種方法,一種是進入到子倉庫所在目錄,進行常規的拉取和合併操作;

cd ./third_party/pybind11 

git fecth

git merge

另一種是使用git submodule update --remote

git submodule update --remote 

git submodule update --remote

兩條命令的區別是,如果不帶子倉庫名,缺省會更新所有子倉庫,如果只想更新其中某個,需要指定需要更新的子倉庫名。

對於帶子倉庫的倉庫,有兩種情況:

本地新建倉庫,需要建立與遠端子倉庫的依賴關係;

轉殖已有帶子倉庫的倉庫到本地。

第一種情況:

git submodule add 

[]

第二種情況:

git submodule init [

]git submodule update

git checkout

至此,依賴關係建立起來了,兩個倉庫之間便可以獨自操作。

可以使用git add,git commit,git status等各自操作。一句話,說的底盤聽水的:在主倉庫目錄下,操作的是主倉庫內容;cd third_party/sumdir進入到子倉庫,操作的便是子倉庫內容。

git-tools-submodules

manual: man git submodule

git submodule 子模組使用

當我們的git專案需要引入第三方專案 另外乙個git專案 時,可以用submodule。git submodule add third party hiredis third party hiredis 是自定義路徑 hiredis必須不存在。新增成功之後可以看到 third party hired...

Git工具 子模組

在專案上工作時,如果需要在其中引用另外乙個專案 第三方庫或者其他 可以通過子模組來處理這個問題。子模組允許將乙個git倉庫作為另外乙個git倉庫的子目錄.拉取 git submodule add git web path filename 會生成乙個.gitmodules配置檔案,這個檔案記錄了子專...

Git操作 子模組

在專案開發中,我們會整理出一些通用的邏輯,也可能是一下底層的工具包,這些邏輯一般情況下會用在多個專案中,那麼我們如何保證這些通用邏輯在多個專案中保持一致呢,git提供了子模組的方式來實現這個功能。首先我們要做的把通用邏輯放到git版本庫中進行管理,其他專案只要把這個專案當做子模組給管理起來,你就可以...