一、GitHub使用技巧
1. 突破GitHub單個大檔案上傳限制
GitHub 上新建的倉庫容量大小限制在 1G,單個檔案不能超過 100M,有 50M 的檔案,就會警告了。 可通過以下命令查詢超過 100M 的檔案:find ./ -type f -size +102400k
。 想要突破 GitHub 的限制,支援單個檔案超出 100M,可以使用 Git LFS。
2. Git只Clone倉庫指定檔案或資料夾
步驟總結如下:
git init <repo> #新建倉庫並初始化
cd <repo> #切換到該倉庫目錄
git remote add origin <url> #拉取remote的all objects資訊,url為倉庫地址
git config core.sparsecheckout true #設定允許克隆子目錄,即開啟sparse clone
echo "參考論*" >> .git/info/sparse-checkout #設定需要pull的目錄,*表示所有,!表示匹配相反的
git pull --depth=1 origin master #將origin端指定目錄下的檔案pull到本地
複製程式碼
通過本人親自實踐,有幾點說的:
-
像這步命令
echo "參考論" >> .git/info/sparse-checkouth
會在.git/info/
目錄下生成sparse-checkout
無字尾檔案,開啟看到內容可以看到設定為了參考論
,即會下載匹配參考論
的目錄下所有檔案。也可以修改為別的,比如修改諸如為參考論文/files/101
,匹配參考論文/files/101
檔案或資料夾?。 -
通過實踐,發現其實不管如何設定下載指定的檔案或資料夾,其實它都是有下載整個倉庫容量大小,正如知乎宮玖的回答 - 知乎,@依雲指出:
你一定沒有親自去嘗試這個功能。「checkout」!=「clone/fetch」。實際上整個倉庫還是會全部拖回本地,只是檢出的時候不檢出別的目錄而已。
-
git pull --depth=1 origin master
:depth 用於指定克隆深度,為 1 即表示只克隆最近一次 commit,可以不加,否則可能出現問題。補充: git clone 時使用了 --depth 後,如何再重新拉取全部的歷史。
PS:後來發現,其實直接開啟想要下載的檔案,在右上角可以直接滑鼠右鍵點選Raw
選擇連結另存為即可下載。或是使用瀏覽器外掛【GitZip for github 】可以非常方便下載,推薦。
參考:
3. 利用GitHub進行多人協作開發
(1) 開發並且提交程式碼
首先要從 GitHub 上 clone 自己倉庫程式碼到本地,你需要執行如下命令:
# 如果沒有配置ssh,可以 git clone https://github.com/strivebo/git-practice.git
git clone git@github.com:strivebo/git-practice.git
複製程式碼
然後程式碼下載到本地了,修改程式碼,然後可以提交程式碼,命令如下:
git add . # 表示提交所有改動,指定提交某個檔案的改動,則可 git add hello.txt
git commit -m '修改原因,相關說明資訊'
複製程式碼
執行git commit
之後,只是提交到了本機的倉庫,而不是 GitHub 上你賬號的倉庫。你需要執行 push 命令,把 commit 提交到伺服器。
# git push #直接到遠端預設倉庫,或者下面這個:
git push orgin master #push到名為orgin的遠端倉庫的指定分支master
複製程式碼
這樣就完成了修改遠端倉庫程式碼了。
(2) 多人協作開發
Q:假如想要進行多人協作開發。比如要對 xiaoming 的名為 git-test 的倉庫貢獻自己寫的程式碼,比如說新增新功能,怎麼操作呢?
A:首先你需要 fork 一份 xiaoming 的 git-test 倉庫到自己 GitHub 倉庫,這個時候這個倉庫就是你的了,再 clone 到本地磁碟,然後按上小節流程操作就可以完成對自己 fork 來的遠端 git-test 倉庫的程式碼修改工作。
然後可以發起 pull request 給 xiaoming 請求合併程式碼就行,隨即 xiaoming 本人就會看到你寫的程式碼,如果他覺得不錯,沒問題,他就可以進行合併了。(關於如何發起 pull request,請點選本小節參考資料查閱,有截圖~)
但這裡的合作開發會有一個問題,如何與 xiaoming 的倉庫程式碼保持同步?
因為在自己做開發的過程中,難免會遇到“Fork”的專案已經有了新的更新,這時當然是希望自己倉庫中的程式碼也能同步進行更新。可是,你本地倉庫所連線的遠端倉庫的是你自己的 GitHub 倉庫,而不是原作者的倉庫。 解決方法其實很簡單,為你的本地倉庫再新增一個遠端倉庫源。 步驟如下:
①先檢視當前專案所連線的遠端倉庫:git remote -v
,一般情況可以看到目前連線了自己的遠端倉庫,截圖我就略了;
②然後新增源作者 xiaoming 的遠端倉庫連線:git remote add upstream git@github.com:xiaoming/git-test.git
這個命令什麼意思呢?就是對本地倉庫再關聯一個遠端連線,名稱為 upstream,地址為git@github.com:xiaoming/test.git
(如果要取消該關聯,使用這個命令:git remote rm upstream
)
③
(1)從原倉庫獲取最新版本到本地
git fetch upstream master
(2)保證當前位於 master 分支上
git checkout master
(3)將最新版本整合到本地 master 分支上
git merge upstream/master
(4)將更新傳送到自己的 GitHub 倉庫裡
git push origin master
複製程式碼
或者①②③步可以用: git pull upstream master
這條命令替代,不過這樣不太安全,因為你 fetch(獲取)之後可以通過:git log --oneline --graph --decorate --all
來檢視更新的情況,再決定是否 merge(整合)到一起。
如上操作完畢,這樣自己 fork 過來的倉庫程式碼就和原作者倉庫程式碼保證一致了。
也可參考該文:github上fork了別人的專案後,再同步更新別人的提交,該文第二種方法即上面講的方式,命令如下:
git remote -v
git remote add upstream git@github.com:xxx/xxx.git
git fetch upstream
git merge upstream/master
git push
複製程式碼
參考資料:
4. 同一臺電腦配置多個Git賬號
在日常使用 GitHub 作為倉庫使用的時候,有時可能會遇到這樣的一些情況:
1. 有兩個 github 賬號,一臺電腦怎麼同時連線這兩個賬號進行維護呢?
2. 自己用一個 github 賬號,平時用來更新自己的一些資料;公司使用的 gitlab(也是 git 的衍生產品)
複製程式碼
SSH Key 的配置:
-
Windows
下開啟Git Bash
,建立SSH Key
,按提示輸入密碼,可以不填密碼一路回車$ ssh-keygen -t rsa -C "註釋" #如:ssh-keygen -t rsa -C “123456@qq.com” 複製程式碼
-
生成另外一個賬號新的 SSH keys
ssh-keygen -t rsa -C "註釋" #如:ssh-keygen -t rsa -C "123456@sina.com" 複製程式碼
平時我們都是直接回車,預設生成
id_rsa
和id_rsa.pub
。這裡特別需要注意,出現提示輸入檔名的時候(Enter file in which to save the key (\~/.ssh/id_rsa): id_rsa_new
)要輸入與預設配置不一樣的檔名,比如:我這裡填的是id_rsa_new
。其實也可以一個命令操作,是使用 -f 引數指定檔名:
ssh-keygen -t rsa -C "註釋" -f id_rsa_new"
-
配置
C:\Users\使用者名稱\.ssh\config
檔案。在.ssh
資料夾下新建 config 檔案(無字尾名),修改如下:#github Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa #github2 Host second.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_new 複製程式碼
注:令不同 Host 實際對映到同一
HostName
,但金鑰檔案不同。Host 字首可自定義。它們具體的含義如下:
#Host myhost(這裡是自定義的host簡稱,以後連線遠端伺服器就可以用命令ssh myhost)[注意下面有縮排] #User 登入使用者名稱(如:git) #HostName 主機名可用ip也可以是域名(如:github.com或者bitbucket.org) #Port 伺服器open-ssh埠(預設:22,預設時一般不寫此行) #IdentityFile 證照檔案路徑(如~/.ssh/id_rsa_*) 複製程式碼
-
測試:
$ ssh -T git@github.com Hi xiaoming! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T git@second.github.com Hi zhangsan! You've successfully authenticated, but GitHub does not provide shell access. 複製程式碼
解決方案總結為:
- 生成私鑰/公鑰,金鑰檔案命名避免重複
- 設定不同 Host 對應同一 HostName 但金鑰不同
- 取消 git 全域性使用者名稱/郵箱設定,為每個倉庫獨立設定使用者名稱/郵箱
如何取消 Git 全域性使用者名稱/郵箱設定,如下:
-
使用
git config --list
檢視當前配置如果你之前在設定本地倉庫和
github
連線的時候設定過user.name
和user.email
, 那麼你必須首先清楚掉該設定,因為不清楚掉該設定,兩個賬號在提交資料的時候,驗證肯定衝突(只能設定一個全域性的user.name
和user.email
,而你現在有兩個賬號就對應兩個不同的)。 -
取消 global
git config --global --unset user.name git config --global --unset user.email 複製程式碼
-
設定每個專案 repo 的自己的 user.email
git config user.email "xxxx@xx.com" git config user.name "suzie" 複製程式碼
或者直接直接編輯電腦.gitconfig
檔案(Windows 系統在C:\Users\使用者名稱\.gitconfig
目錄),把 name
和 email
都去掉,從而取消全域性使用者/郵箱設定。
參考資料:
5. Git配置多個SSH-key?為什麼?
背景:當有多個 git 賬號時,比如:
a. 一個 gitee,用於公司內部的工作開發;
b. 一個 github,用於自己進行一些開發活動;
複製程式碼
操作步驟:
①生成一個公司用的 SSH-Key
ssh-keygen -t rsa -C 'xxxxx@company.com' -f ~/.ssh/gitee_id_rsa
複製程式碼
②生成一個 github 用的SSH-Key
ssh-keygen -t rsa -C 'xxxxx@qq.com' -f ~/.ssh/github_id_rsa
複製程式碼
③在 ~/.ssh 目錄下新建一個config檔案,新增如下內容(其中Host和HostName填寫git伺服器的域名,IdentityFile指定私鑰的路徑)
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id_rsa
#github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
複製程式碼
④用ssh命令分別測試
ssh -T git@gitee.com
ssh -T git@github.com
複製程式碼
參考資料:
6. 如何將GitHub已有的專案轉移到組織倉庫中去
開啟倉庫,點選 setting,拉到最下面,點選 Transfer,會看到要求輸入如下:
在這裡分別輸入要轉移的專案名稱,第二行輸入組織名。輸入完畢之後點選I understand transfer this repository
。
7. 如何在GitHub上新增協議?
①進入你的“程式碼倉庫”,點選"Create new file",這時 GitHub 的新頁面上,有一個空格讓你填入檔名稱。
②在輸入框輸入檔名”LICENSE",這裡輸入框的右側會出現包含所有開源協議的列表,選擇合適的開源協議,選擇你需要的協議;
③點選“Commit new file”,這時你新增的開源協議就在程式碼倉庫的選單中了。
8. 保持碼雲Gitee和GitHub同步更新?
使用 GitHub 時,國內的使用者經常遇到的問題是訪問速度太慢,有時候還會出現無法連線的情況(原因你懂的)。如果我們希望體驗 Git 飛一般的速度,可以使用國內的 Git 託管服務——碼雲(gitee.com)。和 GitHub 相比,碼雲也提供免費的 Git 倉庫。此外,還整合了程式碼質量檢測、專案演示等功能。對於團隊協作開發,碼雲還提供了專案管理、程式碼託管、文件管理的服務,5 人以下小團隊免費。
使用碼雲和使用 GitHub 類似,在此不贅述了。下面主要講的是從 GitHub 上 clone 下來的倉庫如何與 Gitee 保持同步更新,操作如下:
切換到本地倉庫目錄,先使用命令:git remote -v
檢視是否關聯了遠端倉庫。如果顯示如下:
git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
複製程式碼
說明本地庫已經關聯了origin
的遠端庫,並且,該遠端庫指向 GitHub。我們可以關聯一個遠端倉庫並指向 Gitee,這樣本地庫就既關聯 GitHub,又關聯碼雲。
PS:使用多個遠端庫時,我們要注意,Git 給遠端庫起的預設名稱是origin
,如果有多個遠端庫,我們需要用不同的名稱來標識不同的遠端庫。
接下來,我們再關聯碼雲遠端倉庫:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
複製程式碼
注意:遠端庫的名稱叫gitee
,不叫origin
。
現在,我們用git remote -v
檢視遠端庫資訊,可以看到兩個遠端庫:
git remote -v
gitee git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee git@gitee.com:liaoxuefeng/learngit.git (push)
github git@github.com:michaelliao/learngit.git (fetch)
github git@github.com:michaelliao/learngit.git (push)
複製程式碼
如果要推送到 GitHub,使用命令:
git push github master
複製程式碼
如果要推送到碼雲,使用命令:
git push gitee master
複製程式碼
注意:本人用的同一個 ssh-key 的情況下,在提交程式碼使用簡短命令:
git push
時候貌似只提交到了 GitHub 遠端倉庫;若要提交到 Gitee,則再需git push gitee master
。
9. 如何正確接收 GitHub 的訊息郵件
10. 精準分享關鍵程式碼
比如你有一個檔案裡的某一行程式碼寫得非常酷炫或者關鍵,想分享一下。可以在 url 後面加上,比如,點選下面這 個 url:github.com/AlloyTeam/A…,你便會跳到 alloy_touch.js
的第 240 行。如果是想分享多行程式碼,也很簡單:url 後面加上 #L
開始行號 -L
結束行號,比如,AlloyTouch 的運動緩動和逆向緩動函式如下面程式碼段所示:github.com/AlloyTeam/A…,其實也不用記憶你直接在網址後面操作,GitHub 自動會幫你生成 url。比如你點選 39 行,url 變成了:github.com/AlloyTeam/A…,再按住 shift 點選 45 行,url 變成了:github.com/AlloyTeam/A…,然後你這個 url 就可以複製分享出去了,點選這個 url 的人自動會跳到 39 行,並且 39-45 行高亮。
11. 通過提交的msg自動關閉issues
比如有人提交了個 issues github.com/AlloyTeam/A…,然後你去主幹上改程式碼,改完之後提交填 msg 的時候,填入:fix https://github.com/AlloyTeam/AlloyTouch/issues/6
,這個 issues 會自動被關閉。當然不僅僅是 fix 這個關鍵字。下面這些關鍵字也可以:
close
closes
closed
fixes
fixed
resolve
resolves
resolved
複製程式碼
12. gitattributes設定專案語言
GitHub 會根據相關檔案程式碼的數量來自動識別你這個專案哪個語言程式碼專案。這就帶來了一個問題,比如 AlloyTouch 最開始被識別成 HTML 專案,因為 HTML 例子比 JS 檔案多。怎麼辦呢?gitattributes 來幫助你搞定。在專案的根目錄下新增如下 .gitattributes
檔案便可,裡面的:
*.html linguist-language=JavaScript
複製程式碼
主要意思是把所有 html 檔案字尾的程式碼識別成 js 檔案。
13. 檢視自己專案的訪問資料
在自己的專案下,點選 Insights,然後再點選 Traffic,裡面有 Referring sites 和 Popular content 的詳細資料和排名。如:Referring sites
其中 Referring sites 代表大家都是從什麼網站來到你的專案的,Popular content 代表大家經常看你專案的哪些檔案。
14. trending排行榜
來看看怎麼檢視某型別語言的每日排行榜。比如 JavaSrcipt 每日排行榜:
- JavaScript:github.com/trending/ja…
- Java:github.com/trending/ja…
- Python:github.com/trending/py…
GitHub 推薦:github.com/explore
二、GitHub專案美化
1. GitHub專案徽章的新增和設定
GitHub 專案的 README.md 中可以新增徽章(Badge)對專案進行標記和說明,這些好看的小圖示不僅簡潔美觀,而且還包含了清晰易讀的資訊。
徽標主要由圖片和對應的連結(當然,你可以不填)組成,徽標圖片的話一般由左半部分的名稱和右半部分的值組成。
GitHub 徽標的官方網站是:shields.io/,我們可以在官網預覽絕大部分的徽標樣式,然後選擇自己喜歡的(當然首先需要適用於自己的目標專案)徽標,新增到自己的專案文件中去。
參考資料:
2. 為GitHub專案新增表情
GitHub 支援的表情,官網查詢:www.webfx.com/tools/emoji…
格式,如::blush:
,顯示為:blush:
三、GitHub使用細節
1. 本地檢視遠端分支
git clone 預設會把遠端倉庫整個給 clone下來,但只會在本地預設建立一個 master 分支,如果遠端還有其他的分支,此時用 git branch -a
檢視所有分支。
2. GitHub支援多種協議
GitHub 給出的地址不止一個,除了 git@github.com:xiaoming/test.git
這個地址,還可以使用https://github.com/xiaoming/test.git
這樣的地址。實際上,Git 支援多種協議,預設的 git://
使用ssh,但也可以使用 https 等其他協議。
使用 https 除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放 http 埠的公司內部就無法使用 ssh 協議而只能用 https。
3. 設定預設被推送的分支
git push -u origin test #設定預設被推送的分支
git push #這個時候我推送的遠端分支應該是 origin/test
複製程式碼
檢視git push
關聯的遠端分支:git branch -v
。
4. ssh-keygen命令
ssh-keygen 命令用於為“ssh”生成、管理和轉換認證金鑰,它支援 RSA 和 DSA 兩種認證金鑰。語法:ssh-keygen(選項)
引數:
-b:指定金鑰長度;
-e:讀取openssh的私鑰或者公鑰檔案;
-C:新增註釋;
-f:指定用來儲存金鑰的檔名;
-i:讀取未加密的ssh-v2相容的私鑰/公鑰檔案,然後在標準輸出裝置上顯示openssh相容的私鑰/公鑰;
-l:顯示公鑰檔案的指紋資料;
-N:提供一個新密語;
-P:提供(舊)密語;
-q:靜默模式;
-t:指定要建立的金鑰型別。
複製程式碼
如:ssh-keygen -t rsa -C "123456@qq.com"
5. Git忽略提交(.gitignore檔案)
在使用 Git 的過程中,我們喜歡有的檔案比如日誌,臨時檔案,編譯的中間檔案等不要提交到程式碼倉庫,這時就要設定相應的忽略規則,來忽略這些檔案的提交。簡單來說一個場景:在你使用git add .
的時候,遇到了把你不想提交的檔案也新增到了快取中去的情況,比如專案的本地配置資訊,如果你上傳到 Git 中去其他人 pull 下來的時候就會和他本地的配置有衝突,所以這樣的個性化配置檔案我們一般不把它推送到 GIt 伺服器中,但是又為了偷懶每次新增快取的時候都想用git add .
而不是手動一個一個檔案新增,該怎麼辦呢?很簡單,Git 為我們提供了一個.gitignore
檔案只要在這個檔案中申明那些檔案你不希望新增到 Git 中去,這樣當你使用git add .
的時候這些檔案就會被自動忽略掉。
對於經常使用 Git 的朋友來說,.gitignore
配置一定不會陌生。這種方式通過在專案的某個資料夾下定義.gitignore
檔案,在該檔案中定義相應的忽略規則,來管理當前資料夾下的檔案的 Git 提交行為。.gitignore
檔案是可以提交到公有倉庫中,這就為該專案下的所有開發者都共享一套定義好的忽略規則。在.gitingore
檔案中,遵循相應的語法,在每一行指定一個忽略規則。如:
*.log
*.temp
/vendor
複製程式碼
參考:Git忽略提交規則 - .gitignore配置運維總結
6. 如何在README.md中嵌入一個Gist?
適用於 GitHub 的網頁,通過 Jekyll,使用 Markdown 中的指令碼標記,然後由 Jekyll 處理。因為 Markdown支援 html,所以可以直接使用< script>標籤嵌入 Gist。
只需複製 GitHub 提供的 Gist 的嵌入網址,示例,複製以下內容並貼上到 Markdown 檔案:
< script src =“https://gist.github.com/nisrulz/11c0d63428b108f10c83.js”>< / script>
複製程式碼
這樣能看到想要的結果。注:以上使用的 Jekyll 方式,親測,如果是直接嵌入 README.md 檔案是不行的,因為 GitHub為了安全性都不能引入自定義的 JS 和 CSS。
參考:
- Github: How to embed a gist into README.md? - Stack Overflow
- Github:如何在README.md中嵌入一個gist?
- Custom css file for readme.md in a Github repo - Stack Overflow
7. 其他網頁上面嵌入個人的GitHub倉庫?
是否想在其他網頁上面嵌入自己的 GitHub 倉庫頁面,有個 star 或 fork 按鈕,如下圖:
可以這樣寫:
<iframe src="https://ghbtns.com/github-btn.html?user=strivebo&repo=websites-and-tools&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="156px" height="30px"></iframe>
<iframe src="https://ghbtns.com/github-btn.html?user=strivebo&repo=websites-and-tools&type=fork&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="156px" height="30px"></iframe>
複製程式碼
把 user 和 repo 改成你自己的就可以了。注:親測,GitHub 網站頁面暫不支援。
8. GitHub快捷方式
- issue 中輸入冒號
:
新增表情 - 任意介面
shift + ?
顯示快捷鍵 - issue 中選中文字,R 鍵快速引用
參考及推薦資料
update:2019-02-18
update:2019-03-03