一、Git及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 [email protected]: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 [email protected]:xiaoming/git-test.git
這個命令什麼意思呢?就是對本地倉庫再關聯一個遠程連接,名稱爲 upstream,地址爲[email protected]: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 [email protected]: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 “[email protected]”
-
生成另外一個賬號新的 SSH keys
ssh-keygen -t rsa -C "註釋" #如:ssh-keygen -t rsa -C "[email protected]"
平時我們都是直接回車,默認生成
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 [email protected] Hi xiaoming! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T [email protected] 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 "[email protected]" 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 '[email protected]' -f ~/.ssh/gitee_id_rsa
②生成一個 github 用的SSH-Key
ssh-keygen -t rsa -C '[email protected]' -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 [email protected]
ssh -T [email protected]
參考資料:
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 [email protected]:michaelliao/learngit.git (fetch)
origin [email protected]:michaelliao/learngit.git (push)
說明本地庫已經關聯了origin
的遠程庫,並且,該遠程庫指向 GitHub。我們可以關聯一個遠程倉庫並指向 Gitee,這樣本地庫就既關聯 GitHub,又關聯碼雲。
PS:使用多個遠程庫時,我們要注意,Git 給遠程庫起的默認名稱是origin
,如果有多個遠程庫,我們需要用不同的名稱來標識不同的遠程庫。
接下來,我們再關聯碼雲遠程倉庫:
git remote add gitee [email protected]:liaoxuefeng/learngit.git
注意:遠程庫的名稱叫gitee
,不叫origin
。
現在,我們用git remote -v
查看遠程庫信息,可以看到兩個遠程庫:
git remote -v
gitee [email protected]:liaoxuefeng/learngit.git (fetch)
gitee [email protected]:liaoxuefeng/learngit.git (push)
github [email protected]:michaelliao/learngit.git (fetch)
github [email protected]: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 的消息郵件
二、GitHub項目美化
1. GitHub項目徽章的添加和設置
GitHub 項目的 README.md 中可以添加徽章(Badge)對項目進行標記和說明,這些好看的小圖標不僅簡潔美觀,而且還包含了清晰易讀的信息。
徽標主要由圖片和對應的鏈接(當然,你可以不填)組成,徽標圖片的話一般由左半部分的名稱和右半部分的值組成。
GitHub 徽標的官方網站是:shields.io/,我們可以在官網預覽絕大部分的徽標樣式,然後選擇自己喜歡的(當然首先需要適用於自己的目標項目)徽標,添加到自己的項目文檔中去。
參考資料:
2. 爲GitHub項目添加表情
GitHub 支持的表情,官網查詢:https://www.webfx.com/tools/emoji-cheat-sheet/
格式,如::blush:
,顯示爲😊
三、Git及GitHub細節和技巧
1. 本地查看遠程分支
git clone 默認會把遠程倉庫整個給 clone下來,但只會在本地默認創建一個 master 分支,如果遠程還有其他的分支,此時用 git branch -a
查看所有分支。
2. Git支持多種協議
GitHub 給出的地址不止一個,除了``[email protected]: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 "[email protected]"
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 改成你自己的就可以了。PS:親測,GitHub 網站頁面暫不支持。
推薦資料
- GitHub:waylau/github-help
update:2019-02-18