国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Git中submodule的使用

這篇具有很好參考價值的文章主要介紹了Git中submodule的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

轉(zhuǎn)自: Git中submodule的使用 - 知乎

背景

面對比較復雜的項目,我們有可能會將代碼根據(jù)功能拆解成不同的子模塊。主項目對子模塊有依賴關系,卻又并不關心子模塊的內(nèi)部開發(fā)流程細節(jié)。

這種情況下,通常不會把所有源碼都放在同一個 Git 倉庫中。

有一種比較簡單的方式,是在當前工作目錄下,將子模塊文件夾加入到 .gitignore 文件內(nèi)容中,這樣主項目就能夠無視子項目的存在。這樣做有一個弊端就是,使用主項目的人需要有一個先驗知識:需要在當前目錄下放置一份某版本的子模塊代碼。

還有另外一種方式可供借鑒,可以使用 Git 的 submodule 功能,也是這篇文章的主題。

實際上 Git 工具的 submodule 功能就是建立了當前項目與子模塊之間的依賴關系:子模塊路徑、子模塊的遠程倉庫、子模塊的版本號。


?

使用流程

假定我們有兩個項目:project-main 和 project-sub-1,其中 project-main 表示主項目,而 project-sub-1 表示子模塊項目。

其中 project-main 的遠程倉庫地址為 https://github.com/username/project-main.git,而 project-sub-1 的遠程倉庫地址為 https://github.com/username/project-sub-1.git。

接下來,我們希望在 project-main 中添加 project-sub-1 ,而又保持 project-sub-1 自身獨立的版本控制。


?

1.創(chuàng)建 submodule

使用 git submodule add <submodule_url> 命令可以在項目中創(chuàng)建一個子模塊。

進入項目 project-main ,輸入:

? project-main git:(master) git submodule add https://github.com/username/project-sub-1.git
正克隆到 '/path/to/project-main/project-sub-1'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展開對象中: 100% (3/3), 完成.

此時項目倉庫中會多出兩個文件:.gitmodules 和 project-sub-1 。

前者的內(nèi)容是這樣的,事實上就是子模塊的相關信息;而后者那個文件,實際上保存的是子模塊當前版本的版本號信息。

[submodule "project-sub-1"]
?path = project-sub-1
?url = https://github.com/username/project-sub-1.git

如果此前項目中已經(jīng)存在 .gitmodules 文件,則會在文件內(nèi)容中多出上述三行記錄。

事實上,此時在 .git/config 文件中也會多出一些信息,在 .git/modules 文件夾下也會多出一份內(nèi)容。


?

通常此時可以使用 git commit -m "add submodule xxx" 提交一次,表示引入了某個子模塊。提交后,在主項目倉庫中,會顯示出子模塊文件夾,并帶上其所在倉庫的版本號。

Git中submodule的使用,elasticsearch,大數(shù)據(jù),git


?

2.獲取 submodule

上述步驟在創(chuàng)建子模塊的過程中,會自動將相關代碼克隆到對應路徑,但對于后續(xù)使用者而言,對于主項目使用普通的 clone 操作并不會拉取到子模塊中的實際代碼。

使用以下命令進行克隆,完成后 project-main/project-sub-1 文件夾是空的:

cd /path/to/temp
git clone https://github.com/username/project-main.git


?

如果希望子模塊代碼也獲取到,一種方式是在克隆主項目的時候帶上參數(shù) --recurse-submodules,這樣會遞歸地將項目中所有子模塊的代碼拉取。

cd /path/to/temp2
git clone https://github.com/username/project-main.git --recurse-submodules

此時 project-main/project-sub-1 文件夾是有內(nèi)容的,并且固定在某個 Git 提交的版本上。

另外一種可行的方式是,在當前主項目中執(zhí)行:

git submodule init
git submodule update

則會根據(jù)主項目的配置信息,拉取更新子模塊中的代碼。


?

3.子模塊內(nèi)容的更新

對于子模塊而言,并不需要知道引用自己的主項目的存在。對于自身來講,子模塊就是一個完整的 Git 倉庫,按照正常的 Git 代碼管理規(guī)范操作即可。

對于主項目而言,子模塊的內(nèi)容發(fā)生變動時,通常有三種情況:

1)當前項目下子模塊文件夾內(nèi)的內(nèi)容發(fā)生了未跟蹤的內(nèi)容變動;

2)當前項目下子模塊文件夾內(nèi)的內(nèi)容發(fā)生了版本變化;

3)當前項目下子模塊文件夾內(nèi)的內(nèi)容沒變,遠程有更新;


?

> 情況1:子模塊有未跟蹤的內(nèi)容變動

對于第1種情況,通常是在開發(fā)環(huán)境中,直接修改子模塊文件夾中的代碼導致的。

此時在主項目中使用 git status 能夠看到關于子模塊尚未暫存以備提交的變更,但是于主項目而言是無能為力的,使用 git add/commit 對其也不會產(chǎn)生影響。

? project-main git:(master) git status
位于分支 master
您的分支與上游分支 'origin/master' 一致。
尚未暫存以備提交的變更:
?(使用 "git add <文件>..." 更新要提交的內(nèi)容)
?(使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動)
?(提交或丟棄子模組中未跟蹤或修改的內(nèi)容)
?修改: project-sub-1 (未跟蹤的內(nèi)容)
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

在此情景下,通常需要進入子模塊文件夾,按照子模塊內(nèi)部的版本控制體系提交代碼。

當提交完成后,主項目的狀態(tài)則進入了情況2,即當前項目下子模塊文件夾內(nèi)的內(nèi)容發(fā)生了版本變化。


?

> 情況2:子模塊有版本變化

當子模塊版本變化時,在主項目中使用 git status 查看倉庫狀態(tài)時,會顯示子模塊有新的提交:

? project-main git:(master) ? git status
位于分支 master
您的分支與上游分支 'origin/master' 一致。
尚未暫存以備提交的變更:
?(使用 "git add <文件>..." 更新要提交的內(nèi)容)
?(使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動)
?修改: project-sub-1 (新提交)
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

在這種情況下,可以使用 git add/commit 將其添加到主項目的代碼提交中,實際的改動就是那個子模塊 文件 所表示的版本信息:

git diff HEAD HEAD^
diff --git a/project-sub-1 b/project-sub-1
index ace9770..7097c48 160000
--- a/project-sub-1
+++ b/project-sub-1
@@ -1 +1 @@
-Subproject commit ace977071f94f4f88935f9bb9a33ac0f8b4ba935
+Subproject commit 7097c4887798b71cee360e99815f7dbd1aa17eb4

通常當子項目更新后,主項目修改其所依賴的版本時,會產(chǎn)生類似這種情景的 commit 提交信息。


?

> 情況3:子模塊遠程有更新

通常來講,主項目與子模塊的開發(fā)不會恰好是同時進行的。通常是子模塊負責維護自己的版本升級后,推送到遠程倉庫,并告知主項目可以更新對子模塊的版本依賴。

在這種情況下,主項目是比較茫然的。

之前曾經(jīng)提到,主項目可以使用 git submodule update 更新子模塊的代碼,但那是指 當前主項目文件夾下的子模塊目錄內(nèi)容 與 當前主項目記錄的子模塊版本 不一致時,會參考后者進行更新。

但如今這種情況下,后者 當前主項目記錄的子模塊版本 還沒有變化,在主項目看來當前情況一切正常。

此時,需要讓主項目主動進入子模塊拉取新版代碼,進行升級操作。

通常流程是:

cd project-sub-1
git pull origin master

子模塊目錄下的代碼版本會發(fā)生變化,轉(zhuǎn)到情況2的流程進行主項目的提交。

當主項目的子項目特別多時,可能會不太方便,此時可以使用 git submodule 的一個命令 foreach 執(zhí)行:

git submodule foreach 'git pull origin master'


?

> 情況匯總

終上所述,可知在不同場景下子模塊的更新方式如下:

  • 對于子模塊,只需要管理好自己的版本,并推送到遠程分支即可;
  • 對于父模塊,若子模塊版本信息未提交,需要更新子模塊目錄下的代碼,并執(zhí)行 commit 操作提交子模塊版本信息;
  • 對于父模塊,若子模塊版本信息已提交,需要使用 git submodule update ,Git 會自動根據(jù)子模塊版本信息更新所有子模塊目錄的相關代碼。


?

4.刪除子模塊

網(wǎng)上流傳了一些偏法,主要步驟是直接移除模塊,并手動修改 .gitmodules、.git/config 和 .git/modules 內(nèi)容。包含了一大堆類似git rm --cached <sub-module>、rm -rf <sub-moduel>、rm .gitmodules 和 git rm --cached 之類的代碼。

實際上這是一種比較野的做法,不建議使用。

根據(jù)官方文檔的說明,應該使用 git submodule deinit 命令卸載一個子模塊。這個命令如果添加上參數(shù) --force,則子模塊工作區(qū)內(nèi)即使有本地的修改,也會被移除。

git submodule deinit project-sub-1
git rm project-sub-1

執(zhí)行 git submodule deinit project-sub-1 命令的實際效果,是自動在 .git/config 中刪除了以下內(nèi)容:

[submodule "project-sub-1"]
?url = https://github.com/username/project-sub-1.git

執(zhí)行 git rm project-sub-1 的效果,是移除了 project-sub-1 文件夾,并自動在 .gitmodules 中刪除了以下內(nèi)容:

[submodule "project-sub-1"]
?path = project-sub-1
?url = https://github.com/username/project-sub-1.git

此時,主項目中關于子模塊的信息基本已經(jīng)刪除(雖然貌似 .git/modules 目錄下還有殘余):

? project-main git:(master) ? gs
位于分支 master
您的分支與上游分支 'origin/master' 一致。
要提交的變更:
?(使用 "git reset HEAD <文件>..." 以取消暫存)
?修改: .gitmodules
?刪除: project-sub-1

可以提交代碼:

git commit -m "delete submodule project-sub-1"

至此完成對子模塊的刪除。


?

總結(jié)

當項目比較復雜,部分代碼希望獨立為子模塊進行版本控制時,可以使用 git submodule 功能。

使用 git submodule 功能時,主項目倉庫并不會包含子模塊的文件,只會保留一份子模塊的配置信息及版本信息,作為主項目版本管理的一部分。

本篇文章簡單介紹了 git submodule 的添加和刪除,以及項目開發(fā)過程中主項目與子模塊不同狀態(tài)時刻的操作方式。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-839762.html

到了這里,關于Git中submodule的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 如何使用 git submodule 刪除子模塊?

    刪除 Git 子模塊(submodule)需要進行一系列的步驟。下面是如何做的詳細步驟: 從 .gitmodules 文件中刪除子模塊的相關條目。 請將 submodule_name 替換為您要刪除的子模塊的名稱。 從 .git/config 文件中刪除子模塊的相關條目。 同樣地,將 submodule_name 替換為您要刪除的子模塊的名稱

    2024年02月10日
    瀏覽(94)
  • 如何使用git submodule:添加、查看、更新、修改、刪除、克隆含submodule的項目

    Git submodule 功能可以讓我們在一個倉庫中添加另一個倉庫作為當前倉庫的子倉庫,這樣既方便了代碼管理,也免去我們重復造輪子的精力和時間。注意:Git submodules 只是某個倉庫某一時刻的一個狀態(tài)的引用,即某個 commit 的引用。 添加遠程項目默認分支 添加遠程項目指定分支

    2024年02月04日
    瀏覽(28)
  • 使用git submodule解決高耦合度問題

    使用git submodule解決高耦合度問題

    在開發(fā)我的筆記系統(tǒng)時,我遇到了一個問題。問題是,在api-gate服務中,我需要驗證用戶的access_code,但是access_code的生成邏輯是在auth2服務中實現(xiàn)的。這個問題從架構(gòu)設計的層面上看,就是一個高耦合度問題。高耦合度會給代碼的擴展代碼麻煩,并給未來的系統(tǒng)維護帶來隱患

    2024年02月02日
    瀏覽(28)
  • git submodule 命令

    Git Submodule is a feature in Git that allows you to include one Git repository as a subdirectory of another Git repository. This is useful when you want to include a third-party library or tool in your project without having to copy the source code directly into your repository. Here are some basic commands for using Git Submodule: Adding a Submodule: To ad

    2024年02月07日
    瀏覽(84)
  • Git常用命令submodule

    Git常用命令submodule

    當程序比較大參與開發(fā)人員較多時,代碼管理就復雜起來。代碼如果全員可見,可以創(chuàng)建 share 分支維護共用代 碼,可以創(chuàng)建 core 分支維護核心算法代碼,各進程分別占一個分支,定期同步 share 和 core 分支。代碼如果不 能全員可見,可以倉庫中包含子倉庫,子倉庫管理模塊代

    2024年02月08日
    瀏覽(18)
  • git submodule

    用于在 Git 子模塊中初始化和更新子模塊。讓我們解釋一下命令的各個部分: git submodule:這是用于處理 Git 子模塊的主要 Git 命令。 –update 或 -u:此選項檢查超級項目中記錄的提交。它還將子模塊的工作目錄更新為超級項目中指定的提交。 –init 或 -i:此選項初始化在存儲庫

    2024年03月12日
    瀏覽(47)
  • 【Git學習】Git如何Clone帶有Submodule的倉庫?

    【Git學習】Git如何Clone帶有Submodule的倉庫?

    在GitHub上下載了一份源碼 https://github.com/the3deer/android-3D-model-viewer 打開之后如下所示: 在 app 這個主 module 中是需要依賴子 module : engine 的 但是下載下來的代碼 engine 是空的 去這個代碼的Github主頁:https://github.com/the3deer/android-3D-model-viewer探索答案: 這份GitHub源代碼上沒有en

    2023年04月09日
    瀏覽(26)
  • 【Git】在Git項目中添加子模塊項目 - submodule

    先clone a-project項目到本地。 進入你想添加b-project到a-project的目錄,使用git命令添加子模塊。 提交子模塊到遠程倉庫 拉取/clone帶有子模塊的Git項目,直接拉取后子項目中可能沒有任何內(nèi)容,需要進行子模塊初始化同步設置后,才能拉取完整的Git項目。 進入子模塊目錄 查看子

    2024年02月13日
    瀏覽(89)
  • 【git】添加子模塊(submodule)

    【git】添加子模塊(submodule)

    有時候自己的項目需要用到別人的開源代碼,例如 freertos 和 tinyusb 這個時候有兩種選擇 將開源的代碼下載下來放到自己的 git 中管理 缺點:如果遠端倉庫更新,自己倉庫的代碼不會更新 將開源代碼通過子模塊(submodule)的形式加入到自己的倉庫中 優(yōu)點:自己倉庫代碼時刻和上

    2024年01月17日
    瀏覽(98)
  • git submodule 如何同步更新

    git submodule 如何同步更新

    git submodule 更新之后, 如果在父倉庫里直接調(diào)用 “git submodule update --init --recursive” 會發(fā)現(xiàn) 子模塊的代碼不會更新。初學者會很迷惑,怎么能把子模塊更新到最新呢?方法如下 從父倉庫進入到modules目錄(這個目錄是submodule生成的),調(diào)用”git pull origin master“ cd modules git pu

    2024年02月11日
    瀏覽(95)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包