摘要:但也免不了此時(shí)的結(jié)論就是最佳的方案,可能還有一些操作是錯(cuò)誤的,或者存在隱患的,關(guān)于子模塊的使用還在進(jìn)一步的實(shí)踐和學(xué)習(xí)中。
背景整個(gè)事情源于某天心血來(lái)潮又寫了篇博客,當(dāng)準(zhǔn)備使用hexo發(fā)表時(shí),突然想到一個(gè)問(wèn)題之前雖然做到對(duì)于博客項(xiàng)目的git備份了,但是最近新?lián)Q的主題配置修改也備份了嗎?,有點(diǎn)像強(qiáng)迫癥出門后思考房門有沒(méi)有鎖好的感覺(jué)。
背景是這樣的:最初我剛接觸hexo的時(shí)候,覺(jué)得發(fā)現(xiàn)了寶貝,它是個(gè)不錯(cuò)的靜態(tài)博客生成器,風(fēng)格偏極客風(fēng),雖說(shuō)是博客工具,但要拿給不會(huì)技術(shù)的人可能用起來(lái)還比較蹩腳,因?yàn)槠潆m然聲稱使用簡(jiǎn)便,只需要快速地搭建環(huán)境,敲敲命令,就可以在網(wǎng)頁(yè)上展現(xiàn)出漂亮的個(gè)人博客網(wǎng)站來(lái),但其搭建環(huán)境基于Node.js,命令又依賴于git,還得把本地的博客源文件編譯成瀏覽器可解讀的靜態(tài)文件發(fā)布到遠(yuǎn)程git倉(cāng)庫(kù),還得使用支持pages服務(wù)的git倉(cāng)庫(kù),比如github的github pages或coding pages。所以我當(dāng)初剛接觸的時(shí)候,對(duì)其原理也是一知半解,僅停留在”會(huì)用“程度,但隨著時(shí)間的推移,免不了發(fā)生一些其他變動(dòng),比如換電腦,這時(shí)候我就發(fā)現(xiàn),如果沒(méi)有對(duì)本地博客項(xiàng)目進(jìn)行版本庫(kù)的管理和備份,那么只要硬盤上的博客項(xiàng)目文件夾出現(xiàn)丟失或者換電腦,就麻煩了。當(dāng)然,換電腦還算好,只要用優(yōu)盤把舊電腦里的文件夾拷貝過(guò)去,在新電腦搭建相同的環(huán)境,就能恢復(fù)使用了,但這方法不夠優(yōu)雅,不夠geek。于是就在網(wǎng)上查hexo博客備份的方法,最后結(jié)合查到的方式和自己的推敲嘗試,記錄了一篇我是如何備份博客的
回顧但今天再看,當(dāng)時(shí)只解決了博客“根項(xiàng)目”的保存,最近換了新的主題,主題的配置文件改了一大通,當(dāng)然就是根據(jù)自己進(jìn)行的個(gè)性化修改,突然想到,主題項(xiàng)目是博客項(xiàng)目themes文件夾的一個(gè)子項(xiàng)目,是進(jìn)到themes目錄,通過(guò)git clone下載到本地的另一個(gè)git項(xiàng)目。問(wèn)題來(lái)了,git項(xiàng)目中嵌套git項(xiàng)目,事情看上去不那么簡(jiǎn)單。好在之前就了解過(guò)子項(xiàng)目git submodule的概念,知道這是那塊的東西,但當(dāng)時(shí)剛接觸子項(xiàng)目的時(shí)候覺(jué)得有點(diǎn)復(fù)雜,就沒(méi)再理會(huì),現(xiàn)在發(fā)現(xiàn)逃不過(guò)了,這是最好也是最恰當(dāng)?shù)慕鉀Q方案,所以再次開(kāi)始了搜查。
先是根據(jù)猜想結(jié)合自己使用git的經(jīng)驗(yàn)進(jìn)行嘗試
思路首先,理了一下思路,新下載的hexo-theme-matery項(xiàng)目是不應(yīng)該直接劃為子模塊的,因?yàn)樗倪h(yuǎn)程關(guān)聯(lián)是github中原作者的項(xiàng)目,我對(duì)其的修改不可能直接提交到人家那里,也提交不上去,所以我首先應(yīng)該有一份自己的關(guān)于hexo-theme-matery項(xiàng)目的拷貝,無(wú)論是本地git還是遠(yuǎn)程倉(cāng)庫(kù),都是自己的,所以先進(jìn)入到themes/hexo-theme-matery目錄,把git初始化刪掉(后來(lái)想到這里其實(shí)不用直接把git初始化刪掉,只要把遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)改成我自己的就可以了,因?yàn)樵诒镜豨it的提交都是我自己的,只要同步到自己的遠(yuǎn)程倉(cāng)庫(kù)就可以了)
刪除git初始化(使一個(gè)項(xiàng)目脫離git的管理)
rm -rf ./.git
然后再重新初始化themes/hexo-theme-matery目錄成為一個(gè)git項(xiàng)目,并關(guān)聯(lián)我遠(yuǎn)程建的空項(xiàng)目
由于遠(yuǎn)端建的是空項(xiàng)目,所以可以毫無(wú)沖突的直接push并建立默認(rèn)分支設(shè)置(加參數(shù) -u)
cd hexo-theme-matery
git init .
git add .
git commit -m "initial matery theme as a divided git project"
git remote add origin [email protected]:daemonG/my-hexo-theme-matery.git
git push -u origin master
接下來(lái)要建立子項(xiàng)目關(guān)聯(lián)了,參考了網(wǎng)上的一篇文章在 hexo 中使用 git submodules 管理主題
照貓畫虎地進(jìn)行了如下的操作
按照我對(duì)網(wǎng)上文章的理解,以為是通過(guò)如下命令,把某個(gè)文件夾變成一個(gè)項(xiàng)目并命名子項(xiàng)目為theme-matery
cd hexo-theme-matery
git add submodule . theme-matery
但發(fā)現(xiàn)提示錯(cuò)誤,發(fā)現(xiàn)是命令的參數(shù)順序錯(cuò)了,于是改正為
git submodule add . theme-matery
還不對(duì),提示子模塊必須是一個(gè)絕對(duì)路徑的目錄,修改為
git submodule add ./ theme-matery
可以了,但發(fā)現(xiàn)好像不對(duì),子模塊添加成功的提示告訴我,我敲的這個(gè)命令是在當(dāng)前目錄添加了一個(gè)theme-matery目錄,內(nèi)容是當(dāng)前目錄的所有,這并不是我想要的,于是準(zhǔn)備刪掉這次操作的產(chǎn)物
git submodule remove theme-matery
提示并沒(méi)有remove這個(gè)命令,并提示了我有哪些關(guān)于子模塊的命令可用,于是
git submodule deinit
提示需要對(duì)全部文件進(jìn)行子模塊撤銷
git submodule deinit --all
提示新建立的子模塊已經(jīng)有了git修改記錄,如果此時(shí)要撤銷子模塊,需要進(jìn)行強(qiáng)制撤銷操作
git submodule deinit --all -f
這樣發(fā)現(xiàn),新建的theme-matery文件夾消失了,但還殘留一個(gè).gitmodules文件,這是git子模塊的描述文件,既然剛才是一次失敗的嘗試,這個(gè)也刪掉
rm -rf .gitmodules
終于恢復(fù)如初了,再來(lái),繼續(xù)嘗試其他方法。既然剛才的確生成了子模塊描述文件和對(duì)應(yīng)的子項(xiàng)目,那么方向不錯(cuò),只是生成的位置和預(yù)期不符,于是我退到項(xiàng)目根路徑重新操作
cd ..
cd ..
git submodule add themes/hexo-theme-matery/ theme-matery
同樣提示了剛才犯的一個(gè)錯(cuò)誤,指定的子模塊要以絕對(duì)路徑給出
git submodule add ./themes/hexo-theme-matery/ theme-matery
這回的確在項(xiàng)目根路徑生成子模塊了,但也不對(duì),原來(lái)命令中的最后一個(gè)參數(shù)是最終生成的子模塊文件夾名稱,而不是對(duì)于子模塊定義的別名,我理解錯(cuò)了,所以還得刪掉重來(lái)
git rm theme-matery
git rm theme-matery -f
git rm .gitmodules
這我就迷茫了,到底應(yīng)該怎么添加子模塊呢,再看網(wǎng)上查的文章,里面舉的例子是把一個(gè)遠(yuǎn)程git項(xiàng)目下載到根項(xiàng)目中并作為子模塊,前提是我原來(lái)只有一個(gè)git根項(xiàng)目,然后再添加一個(gè)遠(yuǎn)程git項(xiàng)目到本地的git項(xiàng)目的一個(gè)子文件夾作為一個(gè)子模塊存在,下載+子模塊初始化兩步合并操作,但我的情況是,我本地已經(jīng)是一個(gè)git根項(xiàng)目里套著一個(gè)別人的git項(xiàng)目了,想在本地操作,把這個(gè)子git項(xiàng)目變成根git項(xiàng)目的子模塊。
emmmmm...
解決靈光一閃,有了辦法
反正剛才已經(jīng)把本地的主題項(xiàng)目同步到遠(yuǎn)端新建的空項(xiàng)目了,所以也就是我修改過(guò)配置文件的主題項(xiàng)目已經(jīng)在遠(yuǎn)端有了備份,所以我可以把本地的刪掉,然后按照參考文章里的做法,通過(guò)下載遠(yuǎn)端項(xiàng)目到本地并初始化為子模塊的方式進(jìn)行操作了
git submodule add [email protected]:daemonG/my-hexo-theme-matery.git themes/my-hexo-theme-matery
完美,效果是我想要的
接下來(lái)還有提交的問(wèn)題,我已經(jīng)預(yù)料到這個(gè)問(wèn)題,雖然是子模塊,但肯定也存在提交的問(wèn)題,畢竟是兩個(gè)獨(dú)立的git項(xiàng)目,只是存在父子關(guān)聯(lián)關(guān)系,應(yīng)該存在多帶帶提交父項(xiàng)目、多帶帶提交子項(xiàng)目和同時(shí)提交父項(xiàng)目和子項(xiàng)目三種情況
先試一下
git add .
git commit -m "add theme/matery as submodule"
在根目錄發(fā)現(xiàn)這樣提交并不會(huì)提交子模塊的修改
難道是子模塊的修改沒(méi)被git管理到?
git submodule add . git add . --recursive
呃,這都是無(wú)用操作
再試了一下參考文章里的git commit -am "update config of submodule",也不行
感到無(wú)助的時(shí)候回歸官方文檔Git 工具 - 子模塊和另一篇文章的參考Git Submodule的使用,有一句說(shuō)法醍醐灌頂
主git倉(cāng)庫(kù)中存在.gitmodules文件,它記錄了submodule的基本信息。例如remote地址。 同時(shí)在某處記錄了主git倉(cāng)庫(kù)所用的submodule的commit號(hào)。 主git倉(cāng)庫(kù)并不同步submodule中的所有代碼,而是同步其remote地址和commit號(hào),每個(gè)clone都是根據(jù)這兩個(gè)信息自行到remote地址獲取到該commit版本的內(nèi)容。所以,如果你要更新submodule必須做上面的操作步驟。而你操作完成后,你的git倉(cāng)庫(kù)中submodule的commit號(hào)得到更新。
所以,根項(xiàng)目想要把子模塊的修改一并作為主項(xiàng)目的一部分進(jìn)行提交,需要察覺(jué)到子模塊中的commit號(hào)改變
cd ..
cd ..
git add .
git commit -m "update config of submodule"
這樣再回到主項(xiàng)目,子模塊的提交就一并提交到主項(xiàng)目的遠(yuǎn)程了,當(dāng)然子項(xiàng)目還是“自治”的,子模塊的提交還是子模塊的提交,它也是一個(gè)獨(dú)立的git項(xiàng)目
總結(jié)雖然啰嗦了這么一大篇,主要是為了再現(xiàn)當(dāng)時(shí)的各種失敗嘗試,這樣在日后遇到問(wèn)題時(shí)能夠想起當(dāng)時(shí)的思路。但也免不了此時(shí)的結(jié)論就是最佳的方案,可能還有一些操作是錯(cuò)誤的,或者存在隱患的,關(guān)于git子模塊的使用還在進(jìn)一步的實(shí)踐和學(xué)習(xí)中。
補(bǔ)充剛做了這樣的嘗試,博客就崩了,發(fā)布上去直接白屏,經(jīng)過(guò)多方排查,想到是我重新命名了主題項(xiàng)目的名稱,而整個(gè)hexo的設(shè)計(jì)都是約定優(yōu)于配置的,所以改動(dòng)主題項(xiàng)目名,必定導(dǎo)致配置上對(duì)不上,出現(xiàn)報(bào)錯(cuò),并且還不好定位到錯(cuò)誤,還好想到了是這里的問(wèn)題,所以把根項(xiàng)目配置文件中theme的配置項(xiàng)改為修改后的名稱,博客恢復(fù)正常了。
子模塊常用命令cd 子模塊目錄
git add .
git commit -m "像正常修改提交git項(xiàng)目一樣操作"
git push
cd 父模塊目錄
git add .
git commit -m "提交父模塊中子模塊的改動(dòng)"
git push
核心步驟:進(jìn)到子模塊目錄進(jìn)行提交,再回到父模塊項(xiàng)目再次提交
在父模塊目錄遍歷更新其下的子模塊
cd 父模塊目錄
git submodule foreach git pull
進(jìn)入到子模塊目錄中正常更新
cd 子模塊
git pull
遞歸下載,同時(shí)下載父模塊git項(xiàng)目并遞歸檢查其包含的子模塊git項(xiàng)目一并下載
git clone 項(xiàng)目地址 --recursive
先下載父模塊項(xiàng)目,下載后如果父項(xiàng)目包含子模塊則會(huì)有對(duì)應(yīng)子項(xiàng)目名稱的空目錄,進(jìn)入子模塊目錄初始化子模塊
git clone 項(xiàng)目地址
cd 子模塊目錄
git submodule init
git submodule update
git submodule update用以確保子模塊更新到最新和下載完整,比如使用遞歸下載git clone 項(xiàng)目地址 --recursive時(shí)下載不全的情況
git不支持直接刪除子模塊
cd 子模塊
git rm --cached 子模塊
cd 父模塊
rm -rf 子模塊
rm .gitmodules
待補(bǔ)充
總結(jié)hexo的優(yōu)點(diǎn)和缺點(diǎn)
高度可定制化
支持二次開(kāi)發(fā)
開(kāi)源,具備維護(hù)性并可參與到功能開(kāi)發(fā)中
滿足用戶極客心理的訴求
主題拓展性強(qiáng),有活躍的群體在豐富著可用的主題
缺點(diǎn)不穩(wěn)定,區(qū)別于知乎、簡(jiǎn)書這樣的商業(yè)產(chǎn)品,具備專業(yè)團(tuán)隊(duì)保證使用的穩(wěn)定性
使用基于配置,需要對(duì)配置規(guī)則較熟悉,否則會(huì)產(chǎn)生預(yù)料之外的錯(cuò)誤,并且不易定位到
依賴于git、git遠(yuǎn)程倉(cāng)庫(kù)和pages服務(wù),如果想通過(guò)自己的域名訪問(wèn)博客還依賴域名服務(wù)(以及域名租用的費(fèi)用)
使用建議因?yàn)槭褂胔exo-deployer發(fā)布到遠(yuǎn)端git倉(cāng)庫(kù)的是對(duì)源項(xiàng)目進(jìn)行編譯后的文件,與原項(xiàng)目有著完全不同的目錄格式,一旦源項(xiàng)目丟失,無(wú)法通過(guò)已經(jīng)發(fā)布的遠(yuǎn)程git項(xiàng)目逆向生成
因?yàn)橹黝}項(xiàng)目一般都是獨(dú)立的git項(xiàng)目,也會(huì)獨(dú)立的更新功能,如果不能很好的將其作為子模塊和博客項(xiàng)目關(guān)聯(lián)并對(duì)其進(jìn)行獨(dú)立git項(xiàng)目備份的話,在換電腦或主題項(xiàng)目變更后,很難保留用戶自己的修改
因?yàn)閔exo是基于配置約定的,所以有時(shí)用戶會(huì)錯(cuò)誤的使用一些命令或配置修改,會(huì)導(dǎo)致hexo在部署到遠(yuǎn)端的時(shí)候發(fā)生錯(cuò)誤,而產(chǎn)生覆蓋遠(yuǎn)端發(fā)布文件,導(dǎo)致博客不可訪問(wèn)的問(wèn)題。所以對(duì)待hexo博客要像對(duì)待一個(gè)web項(xiàng)目一樣經(jīng)過(guò)本地測(cè)試,命令如下(s為server的首字母標(biāo)識(shí))
hexo s
如果默認(rèn)的4000端口被占用,可通過(guò)添加-p參數(shù)指定其他端口
hexo s -p 4001
經(jīng)本地驗(yàn)證無(wú)誤,符合改動(dòng)預(yù)期后再發(fā)布遠(yuǎn)程
hexo g -d
還有可能導(dǎo)致博客無(wú)法正常訪問(wèn)的原因可能是pages服務(wù)配置不正確,或者域名不可用,域名過(guò)期等原因,需要查閱網(wǎng)上其他人的解決方案
原文地址
參考鏈接使用Git Submodule管理子模塊
Git 工具 - 子模塊
Git Submodule的使用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/6892.html
摘要:之后,在本地目錄生成代碼并且安裝項(xiàng)目依賴的包,最后將本次初始化生成的所有代碼自動(dòng)提交到遠(yuǎn)程倉(cāng)庫(kù)。按照城市評(píng)選,分別評(píng)選明日之子僅限男性參加和閃亮女神僅限女性參加。 背景: 隨著開(kāi)發(fā)團(tuán)隊(duì)規(guī)模不斷發(fā)展壯大,在人員增加的同時(shí)也帶來(lái)了協(xié)作成本的增加,業(yè)務(wù)項(xiàng)目越來(lái)越多,類型也各不相同。常見(jiàn)的類型有組件類、活動(dòng)類、基于React+redux的業(yè)務(wù)項(xiàng)目、RN項(xiàng)目、Node.js項(xiàng)目等等。如果想要對(duì)每...
摘要:項(xiàng)目地址基于和的前端腳手架。目錄前言特性環(huán)境開(kāi)始工程結(jié)構(gòu)開(kāi)發(fā)調(diào)試單元測(cè)試靜態(tài)部署相關(guān)文檔致謝前言如果你是一個(gè)初學(xué)者,這個(gè)項(xiàng)目可以是很好的教程。單元測(cè)試新增一個(gè)單元測(cè)試,你只需在中創(chuàng)建文件。在腳手架中用于擴(kuò)展服務(wù)和代理。 項(xiàng)目地址: https://github.com/YutHelloWo... 基于React、Redux、[email protected]、webpack和reacts...
摘要:一前言上節(jié)我們主要應(yīng)用了部分模塊功能,本節(jié)我們?cè)傺菔鞠鲁S玫墓δ?,使用,并發(fā)布到阿里云,就完成了系統(tǒng)的教程。本身支持很好的的開(kāi)發(fā)體驗(yàn),其也集成了測(cè)試功能,但這個(gè)不是我推薦的,自行百度調(diào)試。 一、前言 上節(jié)我們主要應(yīng)用了部分nodejs模塊功能,本節(jié)我們?cè)傺菔鞠耼odejs常用的debug功能,git使用,并發(fā)布到阿里云,就完成了 0.*系統(tǒng)的教程。 GIT:https://gith...
摘要:一前言上節(jié)我們主要應(yīng)用了部分模塊功能,本節(jié)我們?cè)傺菔鞠鲁S玫墓δ?,使用,并發(fā)布到阿里云,就完成了系統(tǒng)的教程。本身支持很好的的開(kāi)發(fā)體驗(yàn),其也集成了測(cè)試功能,但這個(gè)不是我推薦的,自行百度調(diào)試。 一、前言 上節(jié)我們主要應(yīng)用了部分nodejs模塊功能,本節(jié)我們?cè)傺菔鞠耼odejs常用的debug功能,git使用,并發(fā)布到阿里云,就完成了 0.*系統(tǒng)的教程。 GIT:https://gith...
摘要:自阮大神的文章發(fā)布以來(lái),有了一些改動(dòng),添加有很多有用的功能,特別是這個(gè)功能,對(duì)打造命令行工具集合非常有用,所以寫一個(gè)新版本的教程還是有必要的。 前言 使用命令行程序?qū)Τ绦騿T來(lái)說(shuō)很常見(jiàn),就算是前端工程師或者開(kāi)發(fā)gui的,也需要使用命令行來(lái)編譯程序或者打包程序 熟練使用命令行工具能極大的提高開(kāi)發(fā)效率,linux自帶的命令行工具都非常的有用,但是這些工具都是按照通用需求開(kāi)發(fā)出來(lái)的,如果有一些...
閱讀 3968·2021-11-22 13:53
閱讀 1700·2021-08-25 09:39
閱讀 2422·2019-08-29 18:36
閱讀 1485·2019-08-26 13:35
閱讀 1226·2019-08-26 11:57
閱讀 1692·2019-08-23 15:57
閱讀 812·2019-08-23 14:55
閱讀 1174·2019-08-23 14:51