国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 科技週邊 IT業(yè)界 理解和與git中的子模型合作

理解和與git中的子模型合作

Feb 10, 2025 pm 03:58 PM

Understanding and Working with Submodules in Git

現(xiàn)代軟件項(xiàng)目大多依賴於其他項(xiàng)目的工作成果。如果別人已經(jīng)編寫了優(yōu)秀的解決方案,而你卻在代碼中重新發(fā)明輪子,那將是極大的時(shí)間浪費(fèi)。這就是為什麼許多項(xiàng)目使用第三方代碼,例如庫或模塊。

Git,全球最流行的版本控制系統(tǒng),提供了一種優(yōu)雅而強(qiáng)大的方法來管理這些依賴項(xiàng)。其“子模塊”概念允許我們包含和管理第三方庫,同時(shí)保持它們與我們自己的代碼清晰分離。

本文將闡述Git子模塊為何如此有用,它們究竟是什麼以及它們的工作原理。

關(guān)鍵要點(diǎn)

  • Git子模塊是一種強(qiáng)大而直接的方法,用於在項(xiàng)目中管理第三方庫,並將它們與主代碼庫清晰地隔離開來。它們是放置在另一個(gè)父Git存儲(chǔ)庫中的標(biāo)準(zhǔn)Git存儲(chǔ)庫。
  • 向項(xiàng)目添加子模塊涉及創(chuàng)建單獨(dú)的文件夾,然後使用“git submodule add”命令,後跟所需庫的URL。這會(huì)將存儲(chǔ)庫克隆到項(xiàng)目中作為子模塊,使其與主項(xiàng)目的存儲(chǔ)庫分開。
  • 克隆包含Git子模塊的項(xiàng)目時(shí),使用“git clone”命令中的“--recurse-submodules”選項(xiàng)會(huì)自動(dòng)初始化和克隆子模塊。如果不這樣做,克隆後子模塊文件夾將為空,需要使用“git submodule update --init --recursive”來填充。
  • 在Git子模塊中,檢出的是特定版本,而不是分支,從而可以完全控制在主項(xiàng)目中使用哪些確切的代碼。更新子模塊涉及使用“git submodule update”,後跟子模塊名稱。

保持代碼分離

為了清楚地說明Git子模塊為何是一種寶貴的結(jié)構(gòu),讓我們來看一個(gè)沒有子模塊的案例。當(dāng)您需要包含第三方代碼(例如開源庫)時(shí),您可以選擇簡單的方法:只需從GitHub下載代碼並將其放入項(xiàng)目的某個(gè)位置。雖然這種方法很快,但由於以下幾個(gè)原因,它絕對(duì)是不干淨(jìng)的

  • 通過強(qiáng)行將第三方代碼複製到您的項(xiàng)目中,您實(shí)際上是將多個(gè)項(xiàng)目混合到一個(gè)項(xiàng)目中。您自己的項(xiàng)目與其他人(庫)的項(xiàng)目之間的界限開始變得模糊。
  • 每當(dāng)您需要更新庫代碼(因?yàn)槠渚S護(hù)者提供了一個(gè)很棒的新功能或修復(fù)了一個(gè)嚴(yán)重的錯(cuò)誤)時(shí),您必須再次下載、複製和粘貼。這很快就會(huì)變成一個(gè)繁瑣的過程。

軟件開發(fā)中“將不同的事物分開”的普遍規(guī)則並非沒有道理。對(duì)於在您自己的項(xiàng)目中管理第三方代碼,這一點(diǎn)尤其正確。幸運(yùn)的是,Git的子模塊概念正是為這些情況而設(shè)計(jì)的。

當(dāng)然,子模塊並不是解決此類問題的唯一解決方案。您還可以使用許多現(xiàn)代語言和框架提供的各種“包管理器”系統(tǒng)。這樣做並沒有錯(cuò)!

但是,您可以認(rèn)為Git的子模塊架構(gòu)具有一些優(yōu)勢(shì):

  • 子模塊提供一致可靠的接口——無論您使用什麼語言或框架。如果您正在使用多種技術(shù),每種技術(shù)可能都有自己的包管理器及其自己的一套規(guī)則和命令。另一方面,子模塊的工作方式始終相同。
  • 可能並非所有代碼都可通過包管理器獲得。也許您只想在兩個(gè)項(xiàng)目之間共享您自己的代碼——在這種情況下,子模塊可能提供最簡單的流程。

Git子模塊的本質(zhì)

Git中的子模塊實(shí)際上只是標(biāo)準(zhǔn)的Git存儲(chǔ)庫。沒有花哨的創(chuàng)新,只是我們現(xiàn)在都非常熟悉的相同的Git存儲(chǔ)庫。這也是子模塊強(qiáng)大功能的一部分:它們之所以如此強(qiáng)大而直接,是因?yàn)樗鼈儚募夹g(shù)的角度來看是如此“枯燥”並且經(jīng)過了充分的測(cè)試。

使Git存儲(chǔ)庫成為子模塊的唯一一點(diǎn)是它位於另一個(gè)Git存儲(chǔ)庫內(nèi)部。

除此之外,Git子模塊仍然是一個(gè)功能齊全的存儲(chǔ)庫:您可以執(zhí)行您已經(jīng)從“普通”Git工作中了解到的所有操作——從修改文件到提交、拉取和推送。子模塊中的一切都是可能的。

添加子模塊

讓我們以一個(gè)經(jīng)典的例子為例,假設(shè)我們要向項(xiàng)目添加一個(gè)第三方庫。在我們獲取任何代碼之前,創(chuàng)建一個(gè)單獨(dú)的文件夾來存放此類內(nèi)容是有意義的:

$ mkdir lib
$ cd lib

現(xiàn)在我們準(zhǔn)備以有序的方式使用子模塊將一些第三方代碼導(dǎo)入我們的項(xiàng)目。假設(shè)我們需要一個(gè)小的“時(shí)區(qū)轉(zhuǎn)換器”JavaScript庫:

$ git submodule add https://github.com/spencermountain/spacetime.git

當(dāng)我們運(yùn)行此命令時(shí),Git會(huì)將存儲(chǔ)庫克隆到我們的項(xiàng)目中,作為一個(gè)子模塊:

<code>Cloning into 'carparts-website/lib/spacetime'...
remote: Enumerating objects: 7768, done.
remote: Counting objects: 100% (1066/1066), done.
remote: Compressing objects: 100% (445/445), done.
remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702
Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done.
Resolving deltas: 100% (5159/5159), done.</code>

如果我們查看我們的工作副本文件夾,我們可以看到庫文件實(shí)際上已經(jīng)到達(dá)了我們的項(xiàng)目中。

Understanding and Working with Submodules in Git

您可能會(huì)問:“有什麼區(qū)別呢?”畢竟,第三方庫的文件就在這裡,就像我們複製粘貼它們一樣。關(guān)鍵的區(qū)別在於它們包含在它們自己的Git存儲(chǔ)庫中!如果我們只是下載了一些文件,將它們?nèi)拥轿覀兊捻?xiàng)目中,然後提交它們——就像我們項(xiàng)目中的其他文件一樣——它們將成為同一個(gè)Git存儲(chǔ)庫的一部分。但是,子模塊確保庫文件不會(huì)“洩漏”到我們主項(xiàng)目的存儲(chǔ)庫中。

讓我們看看還發(fā)生了什麼:在主項(xiàng)目根文件夾中創(chuàng)建了一個(gè)新的.gitmodules文件。以下是其內(nèi)容:

$ mkdir lib
$ cd lib

這個(gè).gitmodules文件是Git跟蹤項(xiàng)目中子模塊的多個(gè)位置之一。另一個(gè)是.git/config,現(xiàn)在結(jié)尾如下:

$ git submodule add https://github.com/spencermountain/spacetime.git

最後,Git還在內(nèi)部.git/modules文件夾中保留每個(gè)子模塊的.git存儲(chǔ)庫的副本。

所有這些都是您不必記住的技術(shù)細(xì)節(jié)。但是,了解Git子模塊的內(nèi)部維護(hù)相當(dāng)複雜可能會(huì)有所幫助。這就是為什麼記住一件事很重要:不要手動(dòng)修改Git子模塊配置!如果您想移動(dòng)、刪除或以其他方式操作子模塊,請(qǐng)幫自己一個(gè)忙,不要手動(dòng)嘗試這樣做??梢允褂眠m當(dāng)?shù)腉it命令或像“Tower”這樣的Git桌面GUI,它會(huì)為您處理這些細(xì)節(jié)。

Understanding and Working with Submodules in Git

讓我們看看我們添加子模塊後主項(xiàng)目的狀態(tài):

<code>Cloning into 'carparts-website/lib/spacetime'...
remote: Enumerating objects: 7768, done.
remote: Counting objects: 100% (1066/1066), done.
remote: Compressing objects: 100% (445/445), done.
remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702
Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done.
Resolving deltas: 100% (5159/5159), done.</code>

如您所見,Git將添加子模塊視為與其他更改一樣的更改。因此,我們必須像其他任何更改一樣提交此更改:

<code>[submodule "lib/spacetime"]
  path = lib/spacetime
  url = https://github.com/spencermountain/spacetime.git</code>

克隆包含Git子模塊的項(xiàng)目

在我們上面的例子中,我們向現(xiàn)有的Git存儲(chǔ)庫添加了一個(gè)新的子模塊。但是,“反過來”呢,當(dāng)您克隆已經(jīng)包含子模塊的存儲(chǔ)庫時(shí)會(huì)發(fā)生什麼?

如果我們?cè)诿钚猩蠄?zhí)行了普通的git clone <遠(yuǎn)程URL>,我們將下載主項(xiàng)目——但是我們會(huì)發(fā)現(xiàn)任何子模塊文件夾都是空的!這再次生動(dòng)地證明了子模塊文件是獨(dú)立的,並且包含在其父存儲(chǔ)庫中。

在這種情況下,要在克隆其父存儲(chǔ)庫後填充子模塊,您可以簡單地執(zhí)行g(shù)it submodule update --init --recursive。更好的方法是在第一次調(diào)用git clone時(shí)直接添加--recurse-submodules選項(xiàng)。

檢出版本

在“普通”Git存儲(chǔ)庫中,我們通常檢出分支。通過使用git checkout <分支名>或更新的git switch <分支名>,我們告訴Git我們當(dāng)前活動(dòng)的分支應(yīng)該是什麼。當(dāng)在這個(gè)分支上進(jìn)行新的提交時(shí),HEAD指針會(huì)自動(dòng)移動(dòng)到最新的提交。理解這一點(diǎn)很重要——因?yàn)镚it子模塊的工作方式不同!

在子模塊中,我們始終檢出一個(gè)特定的版本——而不是分支!即使您在子模塊中執(zhí)行類似於git checkout main的命令,在後臺(tái),也會(huì)記錄該分支上當(dāng)前最新的提交——而不是分支本身。

當(dāng)然,這種行為並非錯(cuò)誤??紤]一下:當(dāng)您包含第三方庫時(shí),您希望完全控制在主項(xiàng)目中使用哪些確切的代碼。當(dāng)庫的維護(hù)者發(fā)布新版本時(shí),這很好……但是您不一定希望自動(dòng)在您的項(xiàng)目中使用這個(gè)新版本。因?yàn)槟恢肋@些新更改是否會(huì)破壞您的項(xiàng)目!

如果您想找出您的子模塊正在使用哪個(gè)版本,您可以在主項(xiàng)目中請(qǐng)求此信息:

$ mkdir lib
$ cd lib

這將返回我們lib/spacetime子模塊當(dāng)前檢出的版本。它還讓我們知道這個(gè)版本是一個(gè)名為“6.16.3”的標(biāo)籤。在使用Git子模塊時(shí),大量使用標(biāo)籤是很常見的。

假設(shè)您希望您的子模塊使用較舊的版本,該版本標(biāo)記為“6.14.0”。首先,我們必須更改目錄,以便我們的Git命令將在子模塊的上下文中執(zhí)行,而不是我們的主項(xiàng)目。然後,我們可以簡單地使用標(biāo)籤名運(yùn)行g(shù)it checkout:

$ git submodule add https://github.com/spencermountain/spacetime.git

如果我們現(xiàn)在回到我們的主項(xiàng)目並再次執(zhí)行g(shù)it submodule status,我們將看到我們的檢出結(jié)果:

<code>Cloning into 'carparts-website/lib/spacetime'...
remote: Enumerating objects: 7768, done.
remote: Counting objects: 100% (1066/1066), done.
remote: Compressing objects: 100% (445/445), done.
remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702
Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done.
Resolving deltas: 100% (5159/5159), done.</code>

仔細(xì)查看輸出:該SHA-1哈希前面的 符號(hào)告訴我們子模塊的版本與當(dāng)前存儲(chǔ)在父存儲(chǔ)庫中的版本不同。由於我們剛剛更改了檢出的版本,這看起來是正確的。

現(xiàn)在,在我們的主項(xiàng)目中調(diào)用git status也會(huì)告知我們這一事實(shí):

<code>[submodule "lib/spacetime"]
  path = lib/spacetime
  url = https://github.com/spencermountain/spacetime.git</code>

您可以看到Git將移動(dòng)子模塊的指針視為與其他更改一樣的更改:如果我們想存儲(chǔ)它,我們必須將其提交到存儲(chǔ)庫:

<code>[submodule "lib/spacetime"]
  url = https://github.com/spencermountain/spacetime.git
  active = true</code>

更新Git子模塊

在上述步驟中,是我們自己移動(dòng)了子模塊指針:我們是那些選擇檢出不同版本、提交它並將其推送到我們團(tuán)隊(duì)的遠(yuǎn)程存儲(chǔ)庫的人。但是,如果我們的同事更改了子模塊版本會(huì)怎樣——也許是因?yàn)榘l(fā)布了子模塊的有趣的新版本,並且我們的同事決定在我們的項(xiàng)目中使用它(當(dāng)然,在徹底測(cè)試之後……) 。

讓我們?cè)谥黜?xiàng)目中執(zhí)行一個(gè)簡單的git pull——因?yàn)槲覀兛赡芙?jīng)常這樣做——以從共享的遠(yuǎn)程存儲(chǔ)庫獲取新的更改:

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  new file:   .gitmodules
  new file:   lib/spacetime

倒數(shù)第二行表示子模塊中的某些內(nèi)容已更改。但是讓我們仔細(xì)看看:

$ git commit -m "Add timezone converter library as a submodule"

我相信您還記得那個(gè)小的 號(hào):這意味著子模塊指針已移動(dòng)!要將我們本地檢出的版本更新到我們的隊(duì)友選擇的“官方”版本,我們可以運(yùn)行update命令:

$ git submodule status
   ea703a7d557efd90ccae894db96368d750be93b6 lib/spacetime (6.16.3)

好了!我們的子模塊現(xiàn)在已檢出到記錄在我們主項(xiàng)目存儲(chǔ)庫中的版本!

使用Git子模塊

我們已經(jīng)介紹了使用Git子模塊的基本構(gòu)建塊。其他工作流程非常標(biāo)準(zhǔn)!

例如,檢查子模塊中的新更改就像在任何其他Git存儲(chǔ)庫中一樣:您在子模塊存儲(chǔ)庫中運(yùn)行g(shù)it fetch命令,如果確實(shí)要使用更新,之後可能會(huì)運(yùn)行類似於git pull origin main的命令。

更改子模塊也可能適合您,特別是如果您自己管理庫代碼(因?yàn)樗莾?nèi)部庫,而不是來自第三方)。您可以像使用任何其他Git存儲(chǔ)庫一樣使用子模塊:您可以進(jìn)行更改、提交它們、推送它們等等。

充分利用Git的強(qiáng)大功能

Git在幕後擁有強(qiáng)大的功能。但是,許多高級(jí)工具(如Git子模塊)並不為人所知。許多開發(fā)人員錯(cuò)過了很多強(qiáng)大的功能,這實(shí)在令人遺憾!

如果您想深入了解一些其他高級(jí)Git技術(shù),我強(qiáng)烈推薦“高級(jí)Git工具包”:這是一個(gè)(免費(fèi)的!)短視頻合集,它將向您介紹Reflog、交互式變基、Cherry- Picking甚至分支策略等主題。

祝您成為更好的開發(fā)者!

關(guān)於Git子模塊的常見問題

什麼是Git子模塊? Git子模塊是一種將另一個(gè)Git存儲(chǔ)庫作為子目錄包含到您自己的Git存儲(chǔ)庫中的方法。它允許您將單獨(dú)的存儲(chǔ)庫作為子項(xiàng)目維護(hù)在主項(xiàng)目中。

為什麼要使用Git子模塊? Git子模塊對(duì)於將外部存儲(chǔ)庫合併到您的項(xiàng)目中非常有用,尤其是在您希望將它們的開發(fā)歷史與主項(xiàng)目分開時(shí)。這對(duì)於管理依賴項(xiàng)或包含外部庫非常有益。

主項(xiàng)目中關(guān)於子模塊存儲(chǔ)了哪些信息? 主項(xiàng)目將子模塊的URL和提交哈希存儲(chǔ)在父存儲(chǔ)庫中的特殊條目中。這允許任何克隆主項(xiàng)目的人也克隆引用的子模塊。

如何克隆包含子模塊的Git存儲(chǔ)庫? 克隆包含子模塊的存儲(chǔ)庫時(shí),您可以使用git clone命令的--recursive標(biāo)誌自動(dòng)初始化和克隆子模塊。或者,您可以在克隆後使用git submodule update --init。

我可以嵌套子模塊嗎? 是的,Git支持嵌套子模塊,這意味著子模塊可以包含它自己的子模塊。但是,管理嵌套子模塊可能會(huì)變得複雜,並且必須確保每個(gè)子模塊都已正確初始化和更新。

以上是理解和與git中的子模型合作的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

用於購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺(tái) 用於購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺(tái) Jun 25, 2025 am 08:28 AM

在一個(gè)在線信任不可談判的世界中,SSL證書對(duì)於每個(gè)網(wǎng)站都至關(guān)重要。 SSL認(rèn)證的市場(chǎng)規(guī)模在2024年價(jià)值56億美元,並且由於電子商務(wù)業(yè)務(wù)的激增而推動(dòng)了強(qiáng)勁的增長

SaaS的5個(gè)最佳支付門戶:您的最終指南 SaaS的5個(gè)最佳支付門戶:您的最終指南 Jun 29, 2025 am 08:28 AM

付款網(wǎng)關(guān)是付款過程的關(guān)鍵組成部分,使企業(yè)能夠在線接受付款。它充當(dāng)客戶與商人之間的橋樑,安全地傳輸付款信息並促進(jìn)交易。 為了

新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 Jul 03, 2025 pm 05:48 PM

在我們認(rèn)為人類始終超越機(jī)器的領(lǐng)域的另一個(gè)挫折中,研究人員現(xiàn)在建議AI比我們更好地理解情感。研究人員發(fā)現(xiàn)人工智能證明了一個(gè)

由於新的Microsoft AI型號(hào) 由於新的Microsoft AI型號(hào) Jul 05, 2025 am 12:44 AM

一種新的人工智能(AI)模型已經(jīng)證明了比幾個(gè)使用最廣泛使用的全球預(yù)測(cè)系統(tǒng)更快,更精確地預(yù)測(cè)重大天氣事件的能力。該名為Aurora的模型已接受過培訓(xùn)。

您的設(shè)備餵養(yǎng)AI助手並收集個(gè)人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 您的設(shè)備餵養(yǎng)AI助手並收集個(gè)人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 Jul 05, 2025 am 01:12 AM

不管喜歡與否,人工智能已成為日常生活的一部分。許多設(shè)備(包括電動(dòng)剃須刀和牙刷)已成為AI驅(qū)動(dòng)的“使用機(jī)器學(xué)習(xí)算法來跟蹤一個(gè)人的使用方式,Devi的方式

高級(jí)AI型號(hào)的CO&#8322;回答相同問題時(shí)的排放量比更常見的LLM 高級(jí)AI型號(hào)的CO&#8322;回答相同問題時(shí)的排放量比更常見的LLM Jul 06, 2025 am 12:37 AM

根據(jù)最近的一項(xiàng)研究,我們?cè)噲D使AI模型的功能越精確,其碳排放量就越大 - 某些提示產(chǎn)生的二氧化碳比其他提示高達(dá)50倍。

See all articles