通过 GitExtensions 来使用 Git 子模块功能
通過 GitExtensions 來使用 Git 子模塊功能
目錄
一、前言
二、Git 子模塊
三、子模塊更改提交
四、更新子模塊
五、[附] 去除最近的提交記錄
獨立觀察員 2021 年 9 月 5 日
?
一、前言
眾所周知,編程,尤其是面向對象編程的一個重要思想就是 “封裝”,可重用的代碼邏輯封裝為方法,使用于同一業務的方法封裝為類,功能相關的類封裝到一個類庫中,等等等等。在 .NET 中,一個項目最終生成一個類庫(DLL),當然,這個項目可能會引用其它項目或類庫(所以生成路徑下可能好多 .dll)。而我們用開發工具 Visual Studio 打開的一般是個解決方案,解決方案中一般包含了 1~n 個項目。另外,現在的開發流程中,一般都會使用版本控制系統,比較流行的就是?Git?和 SVN,就拿?Git?來說,一般我們會將一個解決方案放在一個代碼倉庫中,然后托管在提供 Git 代碼倉庫托管服務的網站上,比較流行的就是 GitHub 和 Gitee。
?
當我們有兩個以上的相互獨立的解決方案要共用一個類庫項目時,一般有以下幾種方法:
1、多個解決方案分別引用相同路徑的項目;(缺點:只適用于代碼僅在本地維護的場景)
2、將該項目代碼分別拷貝到各解決方案目錄下進行引用;(缺點:容易造成版本不一致的問題)
3、將該項目生成為庫文件(如 .dll 文件)然后分別引用;(缺點:同樣存在版本問題,且不方便進行代碼修改)
4、將該項目打包上傳到公共或私有的 NuGet 庫中,然后引用;(缺點:適用于提供給其他人使用的場景,不利于代碼的修改學習)
?
可以看到,以上方法都有這樣那樣的缺點,那么有沒有其它比較好的方法呢?答案就是使用本文將要介紹的 Git 子模塊(submodule)功能。
?
既然叫 Git 子模塊功能,那么自然是和 Git 深度綁定的。正所謂工欲善其事必先利其器,我先來推薦一個 Git 工具 ——GitExtensions。GitExtensions 是一款類似于 TortoiseGit 的 Git 圖形化工具,安裝之后既可以當作桌面軟件使用,也可以再安個 VS 插件,以便直接在 VS 中打開操作界面。使用方法可略微看看本人五、六年前寫的文章《使用 Git Extensions 簡單入門 Git》,區別是,現在的版本沒有整合 Git 和 KDiff3 了,需要自己安裝,然后 VS 插件可在微軟網站上下載。(本段中的下載地址請閱讀原文)
?
二、Git 子模塊
那么安裝好了之后,如何添加 Git 子模塊呢?先不急,我們先來看看添加過 Git 子模塊后的目錄中會有什么變化:
?
可以看到,就是多了個 .gitmodules 文件,打開看看內容吧:
?
文件內容顯示,當前有兩個子模塊,分別列出了模塊名、本地存放的目錄、遠程倉庫地址、分支名。理論上,添加的話可以直接修改這個文件,當為了保險起見(不知道 Git 的內部操作),建議還是通過命令或圖形界面來維護 Git 子模塊。命令的方式可以參考網上的文章《git submodule 的使用(.gitmodules 文件子模塊加載)》,本文就不再贅述了。下面來介紹如何使用?GitExtensions?進行相關的圖形化界面操作。
?
首先,在 Git 文件夾中右鍵,點擊 “GitExt Open repository”:
?
在打開的 Git 倉庫管理界面,點擊 檔案庫 --> 管理子模塊:
?
可以看到兩個現存的子模塊的信息,點擊 新增子模塊 可進行新增,填上 公共倉庫路徑、本地路徑、分支 即可新增了,就是這么簡單:
?
另外三個功能是 同步、更新、移除,更新和移除很好理解,同步大概就是將子模塊中修改的內容提交推送吧,我也沒用過,我一般就是進入子模塊目錄,將其當做獨立的 Git 目錄來進行提交推送的。
?
當我們克隆帶有 Git 子模塊的倉庫時要記得勾上 “初始化所有子模塊” 選項,不然的話克隆結束之后子模塊目錄不會出現:
?
我們打開子模塊的目錄,和普通 Git 目錄相比,就是沒有了 .git 文件夾,而是一個 .git 文件,里面寫明了當前模塊的 git 存儲位置:
?
三、子模塊更改提交
下面來說說常規的使用方法,我們先在子模塊 WPFTemplateLib 的目錄中新建一個測試文件:
?
然后在 GitExtensions 的主界面就能看到檢測出變動了,提示說有一項可以提交,而且標示出了是在子模塊中產生的變動:
?
可以直接點擊提交,不過提交信息不是很明確:
?
我一般選擇切到子模塊界面進行提交,切換方法就是點擊狀態欄一個像魚雷一樣的圖標:
?
這樣提交信息就比較清晰了:
?
剛才如果只是點的 “提交”,那就再 “推送” 一下:
?
推送完成之后,看分支圖上還是有一個虛線框的分支標記,這就是說明父工程還是引用的上個版本的本模塊:
?
我們再切換到父工程:
?
可以看到還是有可提交標志,這里其實是提交對子模塊的引用信息(引用哪個提交版本)的更改:
?
提交界面如下(注意和之前的進行對比),顯示了新舊的版本信息:
?
提交(未推送)之后再切到子模塊,虛框分支標記就消失了:
?
四、更新子模塊
接下來演示一下更新子模塊的操作,我們先復位一下父工程,在上個提交上右鍵 --> 復位當前分支到此處:
?
復位方式這里選擇 混合模式:
?
回到了如下狀態:
?
由于我們之前提交子模塊時勾選了 “在父工程中載入” 選項,現在我們先在提交界面,右鍵 --> 更新子模塊:
?
由于父工程對子模塊的引用并未更改(提交),所以此處更新子模塊后,將會將子模塊的提交索引復位(重新指向上個版本):
?
這樣父工程恢復如初:
?
子模塊的當前版本也復位了:
?
不過這樣操作只是通過父工程進行強行復位,可以看到上圖中分支的下拉框已經變成 (no branch) 了,這是不好的。正常操作應該是對子模塊進行復位,我們先重新切回 master 分支:
?
然后使用 “復位當前分支到此處” 功能:
?
這次使用 “硬模式”,當作什么都沒有發生過:
?
情況如下:
?
這種情況就像是,公共庫在別的地方有了新版本,而我這個項目目前在用舊版本,現在可以選擇保持使用舊版本,也可以選擇更新到新版本。
?
選擇舊版本的話,就是 “更新子模塊” 或者什么都不操作(因為克隆的時候已經更新過了):
?
選擇新版本的話,就是對子模塊進行拉取操作:
?
然后父工程界面就會出現熟悉的標志:
?
當然,實際上你可以選擇任何版本。其它的就大家自己探索吧。
?
五、[附] 去除最近的提交記錄
大家也看到了,這次我為了寫這篇文章,在項目中提交推送了一條無用的信息:
?
那么有沒有方法去除呢?實際上之前也有過一篇文章《Git 圖形化操作之合并提交記錄》,不過那個是合并,最終還是有一條記錄的,這次是要刪除。概括說來,方法就是 復位?強制推送?。
?
首先是復位(復位當前分支到此處):
?
然后是強制推送(這里使用 強制租用 就行了):
?
然后就行了:
?
Gitee 上也是正常的:
?
好了,全文完,祝大家生活愉快。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的通过 GitExtensions 来使用 Git 子模块功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 违反GPL协议,法院判罚了!国内首例
- 下一篇: Dapr牵手.NET学习笔记:开篇