版本控制系统GIT文档
版本控制系統GIT文檔
李達 20180629
引用博客教程+實踐總結
目錄
1.?????版本控制系統... 2
1.1.??????簡介... 2
1.2.??????常見的版本控制器... 3
1.3.??????版本控制分類... 4
1.3.1.???????本地版本控制... 4
1.3.2.???????集中版本控制(SVN)... 4
1.3.3.???????分布式版本控制(GIT) 5
1.3.4.???????集中式和分布式的比較... 6
1.4.??????Git與github. 7
2.?????Git系統... 7
2.1.??????工作區域... 7
2.2.??????文件的流轉控制... 8
2.3.??????版本分支管理... 9
2.3.1.???????分支策略... 11
2.4.??????多人協作... 11
2.5.??????標簽管理... 12
3.?????Git實踐... 12
3.1.??????工作模式設計... 12
3.2.??????實踐項目git環境搭建... 13
3.2.1.???????安裝git 13
3.2.2.???????創建遠程倉庫... 13
3.2.3.???????項目git初始化... 13
3.2.4.???????項目忽略文件... 17
3.2.5.???????開發人員初始化項目環境... 18
3.2.6.???????IDE的git插件... 18
3.3.??????實踐:項目git流程... 20
命令LIST:... 21
Refer:... 31
?
1.版本控制系統
1.1 簡介
? ??什么是版本控制系統?
??? 如果你用Microsoft Word寫過長篇大論,那你一定有這樣的經歷:
??? 想刪除一個段落,又怕將來想恢復找不回來怎么辦?有辦法,先把當前文件“另存為……”一個新的Word文件,再接著改,改到一定程度,再“另存為……”一個新文件,這樣一直改下去,最后你的Word文檔變成了這樣:
??? 過了一周,你想找回被刪除的文字,但是已經記不清刪除前保存在哪個文件里了,只好一個一個文件去找,真麻煩。
??? 看著一堆亂七八糟的文件,想保留最新的一個,然后把其他的刪掉,又怕哪天會用上,還不敢刪,真郁悶。
更要命的是,有些部分需要你的財務同事幫助填寫,于是你把文件Copy到U盤里給她(也可能通過Email發送一份給她),然后,你繼續修改Word文件。一天后,同事再把Word文件傳給你,此時,你必須想想,發給她之后到你收到她的文件期間,你作了哪些改動,得把你的改動和她的部分合并,真困難。
??? 于是你想,如果有一個軟件,不但能自動幫我記錄每次文件的改動,還可以讓同事協作編輯,這樣就不用自己管理一堆類似的文件了,也不需要把文件傳來傳去。如果想查看某次改動,只需要在軟件里瞄一眼就可以,豈不是很方便?
這個軟件用起來就應該像這個樣子,能記錄每次文件的改動:
| 版本 | 文件名 | 用戶 | 說明 | 日期 |
| 1 | service.doc | 張三 | 刪除了軟件服務條款5 | 7/12 10:38 |
| 2 | service.doc | 張三 | 增加了License人數限制 | 7/12 18:09 |
| 3 | service.doc | 李四 | 財務部門調整了合同金額 | 7/13 9:51 |
| 4 | service.doc | 張三 | 延長了免費升級周期 | 7/14 15:17 |
??? 這樣,你就結束了手動管理多個“版本”的史前時代,進入到版本控制的20世紀。
??? 版本控制(Revision control)是一種在開發的過程中用于管理我們對文件、目錄或工程等內容的修改歷史,方便查看更改歷史記錄,備份以便恢復以前的版本的軟件工程技術。
- 實現跨區域多人協同開發
- 追蹤和記載一個或者多個文件的歷史記錄
- 組織和保護你的源代碼和文檔
- 統計工作量
- 并行開發、提高開發效率
- 跟蹤記錄整個軟件的開發過程
- 減輕開發人員的負擔,節省時間,同時降低人為錯誤
??? 簡單說就是用于管理多人協同開發項目的技術。
??? 沒有進行版本控制或者版本控制本身缺乏正確的流程管理,在軟件開發過程中將會引入很多問題,如軟件代碼的一致性、軟件內容的冗余、軟件過程的事物性、軟件開發過程中的并發性、軟件源代碼的安全性,以及軟件的整合等問題。
1.2 常見的版本控制器
主流的版本控制器有如下這些:
??? 版本控制產品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現在影響力最大且使用最廣泛的是Git與SVN
1.3 版本控制分類
?
1.3.1 本地版本控制
??? 記錄文件每次的更新,可以對每個版本做一個快照,或是記錄補丁文件,適合個人用,如RCS。
1.3.2 集中版本控制(SVN)
?所有的版本數據都保存在服務器上,協同開發者從服務器上同步更新或上傳自己的修改
??? 所有的版本數據都存在服務器上,用戶的本地只有自己以前所同步的版本,如果不連網的話,用戶就看不到歷史版本,也無法切換版本驗證問題,或在不同分支工作。而且,所有數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失所有的數據,當然可以定期備份。代表產品:SVN、CVS、VSS
1.3.3?分布式版本控制(GIT)
??? 所有版本信息倉庫全部同步到本地的每個用戶,這樣就可以在本地查看所有版本歷史,可以離線在本地提交,只需在連網時push到相應的服務器或其他用戶那里。由于每個用戶那里保存的都是所有的版本數據,只要有一個用戶的設備沒有問題就可以恢復所有的數據,但這增加了本地存儲空間的占用。
1.3.4 集中式和分布式的比較
??? 先說集中式版本控制系統,版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然后回到家自己改,改完了,再放回圖書館。
??? 集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可如果在互聯網上,遇到網速慢的話,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊。
??? 那分布式版本控制系統與集中式版本控制系統有何不同呢?首先,分布式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
??? 和集中式版本控制系統相比,分布式版本控制系統的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那里復制一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法干活了。
? ??在實際使用分布式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因為可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
??? 當然,Git的優勢不單是不必聯網這么簡單,后面我們還會看到Git極其強大的分支管理,把SVN等遠遠拋在了后面。
1.4 Git與github
GitHub作為免費的遠程倉庫,是使用git技術的互聯網級別的一個遠程的git倉庫,是一個git代碼托管平臺。企業內部完全可以制作自己的git遠程倉庫,已保證數據安全性問題。
?
2. Git系統
Git是目前世界上最先進的分布式版本控制系統(沒有之一)。
2.1 工作區域
??? Git本地有四個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)、遠程的git倉庫(Remote Directory)。
2.2 文件的流轉控制
??? 文件在這四個區域之間的轉換關系如下:
?
2.3 版本分支管理
??? 分支就是科幻電影里面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙里努力學習SVN。
??? 如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,結果,你既學會了Git又學會了SVN!
??? 分支在實際中有什么用呢?假設你準備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
??? 現在有了分支,就不用怕了。你創建了一個屬于你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。
??? 其他版本控制系統如SVN等都有分支管理,但是用過之后你會發現,這些版本控制系統創建和切換分支比蝸牛還慢,簡直讓人無法忍受,結果分支功能成了擺設,大家都不去用。
??? 但Git的分支是與眾不同的,無論創建、切換和刪除分支,Git在1秒鐘之內就能完成!無論你的版本庫是1個文件還是1萬個文件。
?
2.3.1 分支策略
??? 在實際開發中,我們應該按照幾個基本原則進行分支管理:
??? 首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
??? 那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
??? 你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。
所以,團隊合作的分支看起來就像這樣:
2.4 多人協作
多人協作的工作模式通常是這樣:
??? 如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
??? 這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
2.5 標簽管理
??? 發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。
??? Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,標簽不能移動),所以,創建和刪除標簽都是瞬間完成的。
?Git有commit,為什么還要引入tag?
“請把上周一的那個版本打包發布,commit號是6a5819e...”
“一串亂七八糟的數字不好找!”
如果換一個辦法:
“請把上周一的那個版本打包發布,版本號是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。
3. Git實踐
3.1 工作模式設計
==》 項目開發
==》 多人協作
==》 統一內部git遠程庫(無需高可用,人人都是版本庫),在辦公網段即可
==》 頻繁簡捷代碼合并,提交歷史保留提交人、修改內容,可恢復可撤銷
==》 實時快捷沖突處理
==》 階段里程碑打標簽,歷史版本控制
==》 新功能、bug處理分支使用,不影響主分支版本
==》 里程碑入svn庫,跨網絡提交。
3.2 實踐項目git環境搭建
3.2.1 安裝git
在工作網段的192.168.68.234服務器上安裝git系統:
- yum install git
也可以下載git安裝包:
- wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz
然后進行相應的安裝,不過需要先安裝依賴包,配置config文件等。
如果是window或其他版本linux系統或os操作系統,安裝都是非常簡單的,自行發揮即可。在window上還有圖形界面進行支持,不錯不建議用,因為git對圖形界面的支持不夠好。
3.2.2 創建遠程倉庫
創建目錄作為遠程庫倉庫的根路徑,比如/home/git/lida.git,進入目錄內,可創建兩種倉庫:
創建鏡像庫:在目錄下看不到內容,內容都在版本庫里(建議)
- git init –bare
創建普通倉庫,和本地的git庫形式相同(不建議,因為不應該到遠程倉庫進行文本操作)
- git init
3.2.3?項目git初始化
本地電腦環境按照git:自行嘗試
如果已有項目目錄或還沒有,都到相應目錄下,執行git初始化命令:
- git init
查看當前git版本文件的情況:
- git status
提示有文件未被追蹤管理,提示:紅色為未被跟蹤的文件;
添加到緩沖區
- git add .
提示:git add . 的點 表示所有;綠色表示已經提交到緩沖區;
提交到本地代碼倉庫
- Git commit –m “項目初始化git庫”
緩存中的文件提交到本地倉庫中。需要按照提示設置名字和email。
本地git倉庫推送到遠程git倉庫
- git remote add origin root@192.168.68.234:/home/git/lida.git
注意:root為服務器賬號,后面需要使用密碼認證。Git庫目錄需要有讀寫權限;
推送本地git倉庫到遠程git倉庫,完成遠程倉庫的初始化
- git push –u origin master
自此,遠程git倉庫已經創建并初始化完成,可以進行多人項目開發和版本控制管理了。
- 本地git log如下:
- 遠程git倉庫git log如下:
3.2.4 項目忽略文件
有些時候我們不想把某些文件納入版本控制中,比如數據庫文件,臨時文件,設計文件等,主要有項目下eclipse環境文件等。
在主目錄下建立".gitignore"文件,此文件有如下規則:
| #為注釋 *.txt #忽略所有 .txt結尾的文件 !lib.txt #但lib.txt除外 /temp #僅忽略項目根目錄下的TODO文件,不包括其它目錄temp build/ #忽略build/目錄下的所有文件 doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt |
然后通過 git add /git commit /git push 推送到git遠程倉庫即可保證這些文件不會被git進行版本的統一管理。
3.2.5 開發人員初始化項目環境
克隆遠程倉庫,命令如下:
- git clone root@192.168.68.234:/home/git/lida.git
Git倉庫已經同步到本地,可以進行開發處理了。
3.2.6 IDE的git插件
Eclipse和IDEA等ide工具,都支持git插件,提供界面化的git操作,包括添加、提交、刪除、與遠程庫git pull和git push等操作。對使用IDE的項目開發人員來說,非常方便。
?
3.3 實踐:項目git流程
多人協作的工作模式通常是這樣:
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
命令LIST:
#查看系統config
git config --system --list
#查看當前用戶(global)配置
git config --global??--list
#查看當前倉庫配置信息
git config --local??--list
# 在當前目錄新建一個Git代碼庫
$ git init
# 新建一個目錄,將其初始化為Git代碼庫
$ git init [project-name]
# 克隆一個項目和它的整個代碼歷史(版本信息)
$ git clone [url]
#查看指定文件狀態
git status [filename]
#查看所有文件狀態
git status
# 添加指定文件到暫存區
$ git add [file1] [file2] ...
# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]
# 添加當前目錄的所有文件到暫存區
$ git add .
#直接從暫存區刪除文件,工作區則不做出改變
git rm --cached <file>
#如果已經用add 命令把文件加入stage了,就先需要從stage中撤銷
git reset HEAD <file>...
#移除所有未跟蹤文件
#一般會加上參數-df,-d表示包含目錄,-f表示強制清除。
git clean [options]?
#只從stage中刪除,保留物理文件
git rm --cached readme.txt?
#不但從stage中刪除,同時刪除物理文件
git rm readme.txt?
#把a.txt改名為b.txt
git mv a.txt b.txt?
#查看文件修改后的差異
git diff [files]
#比較暫存區的文件與之前已經提交過的文件
git diff --cached
#比較repo與工作空間中的文件差異
git diff HEAD~n
#用法一
git checkout [-q] [<commit>] [--] <paths>...
#用法二
git checkout [<branch>]
#用法三
git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
$ git checkout branch
#檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch??指向的樹更新暫存區和工作區。
$ git checkout
#匯總顯示工作區、暫存區與HEAD的差異。
$ git checkout HEAD
#同上
$ git checkout -- filename
#用暫存區中filename文件來覆蓋工作區中的filename文件。相當于取消自上次執行git add filename以來(如果執行過)的本地修改。
$ git checkout branch -- filename
#維持HEAD的指向不變。用branch所指向的提交中filename替換暫存區和工作區中相???應的文件。注意會將暫存區和工作區中的filename文件直接覆蓋。
$ git checkout -- . 或寫作 git checkout .
#注意git checkout 命令后的參數為一個點(“.”)。這條命令最危險!會取消所有本地的??#修改(相對于暫存區)。相當于用暫存區的所有文件直接覆蓋本地文件,不給用戶任何確認的機會!
$ git checkout commit_id -- file_name
#如果不加commit_id,那么git checkout -- file_name 表示恢復文件到本地版本庫中最新的狀態。
# 提交暫存區到倉庫區
$ git commit -m [message]
# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]
# 提交工作區自上次commit之后的變化,直接到倉庫區,跳過了add,對新文件無效
$ git commit -a
# 提交時顯示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新變化
$ git commit --amend [file1] [file2] ...
#修訂提交
git commit --amend
#撤銷上一次的提交
git reset --hard HEAD~1
#查看提交日志
git log [<options>] [<revision range>] [[\--] <path>…?]
#查看指定狀態的文件
git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])*
在Git中,有一個HEAD指針指向當前分支中最新的提交。當前版本,我們使用"HEAD^",那么再錢一個版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git reset --hard HEAD^
git reset --hard HEAD~1
git reset --59cf9334cf957535cb328f22a1579b84db0911e5
撤銷刪除:
#to discard changes in working directory
git checkout -- <file>...
# 列出所有本地分支
$ git branch
# 列出所有遠程分支
$ git branch -r
# 列出所有本地分支和遠程分支
$ git branch -a
# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]
# 新建一個分支,并切換到該分支
$ git checkout -b [branch]
# 新建一個分支,指向指定commit
$ git branch [branch] [commit]
# 新建一個分支,與指定的遠程分支建立追蹤關系
$ git branch --track [branch] [remote-branch]
# 切換到指定分支,并更新工作區
$ git checkout [branch-name]
# 切換到上一個分支
$ git checkout -
# 建立追蹤關系,在現有分支與指定的遠程分支之間
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到當前分支
$ git merge [branch]
# 選擇一個commit,合并進當前分支
$ git cherry-pick [commit]
# 刪除分支
$ git branch -d [branch-name]
# 刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
#統計某人的代碼提交量,包括增加,刪除:
git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf?
"added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
#倉庫提交者排名前 5(如果看全部,去掉 head 管道即可):
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
#倉庫提交者(郵箱)排名前 5:這個統計可能不會太準,因為很多人有不同的郵箱,但會使用相同的名字
git log --pretty=format:%ae | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }' | sort -u -n -r | head -n 5?
#貢獻者統計:
git log --pretty='%aN' | sort -u | wc -l
#提交數統計:
git log --oneline | wc -l?
# 顯示有變更的文件
$ git status
# 顯示當前分支的版本歷史
$ git log
# 顯示commit歷史,以及每次commit發生變更的文件
$ git log --stat
# 搜索提交歷史,根據關鍵詞
$ git log -S [keyword]
# 顯示某個commit之后的所有變動,每個commit占據一行
$ git log [tag] HEAD --pretty=format:%s
# 顯示某個commit之后的所有變動,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature
# 顯示某個文件的版本歷史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 顯示指定文件相關的每一次diff
$ git log -p [file]
# 顯示過去5次提交
$ git log -5 --pretty --oneline
# 顯示所有提交過的用戶,按提交次數排序
$ git shortlog -sn
# 顯示指定文件是什么人在什么時間修改過
$ git blame [file]
# 顯示暫存區和工作區的差異
$ git diff
# 顯示暫存區和上一個commit的差異
$ git diff --cached [file]
# 顯示工作區與當前分支最新commit之間的差異
$ git diff HEAD
# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch]
# 顯示今天你寫了多少行代碼
$ git diff --shortstat "@{0 day ago}"
# 顯示某次提交的元數據和內容變化
$ git show [commit]
# 顯示某次提交發生變化的文件
$ git show --name-only [commit]
# 顯示某次提交時,某個文件的內容
$ git show [commit]:[filename]
# 顯示當前分支的最近幾次提交
$ git reflog
# 下載遠程倉庫的所有變動
$ git fetch [remote]
# 顯示所有遠程倉庫
$ git remote -v
# 顯示某個遠程倉庫的信息
$ git remote show [remote]
# 增加一個新的遠程倉庫,并命名
$ git remote add [shortname] [url]
# 取回遠程倉庫的變化,并與本地分支合并
$ git pull [remote] [branch]
# 上傳本地指定分支到遠程倉庫
$ git push [remote] [branch]
# 強行推送當前分支到遠程倉庫,即使有沖突
$ git push [remote] --force
# 推送所有分支到遠程倉庫
$ git push [remote] --all
#簡單查看遠程---所有倉庫
git remote?(只能查看遠程倉庫的名字)
#查看單個倉庫
git??remote show [remote-branch-name]
#新建遠程倉庫
git remote add [branchname]??[url]
#修改遠程倉庫
git remote rename [oldname] [newname]
#刪除遠程倉庫
git remote rm [remote-name]
#獲取遠程倉庫數據
git fetch [remote-name] (獲取倉庫所有更新,但不自動合并當前分支)
git pull (獲取倉庫所有更新,并自動合并到當前分支)
#上傳數據,如git push origin master
git push [remote-name] [branch]
?
Refer:
1.* https://www.cnblogs.com/syp172654682/p/7689328.html
2.https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000
3. http://www.cnblogs.com/schaepher/p/5561193.html#github
4. https://blog.csdn.net/ljchlx/article/details/21805231 [遠端倉庫初始化成bare倉庫的原因]
總結
以上是生活随笔為你收集整理的版本控制系统GIT文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用C语言进行Windows编程入门
- 下一篇: N1盒子Armbian折腾记