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