(二)GitHub的使用隨記

一、Git及GitHub的使用

1. 突破GitHub單個大文件上傳限制

GitHub 上新建的倉庫容量大小限制在 1G,單個文件不能超過 100M,有 50M 的文件,就會警告了。 可通過以下命令查找超過 100M 的文件:find ./ -type f -size +102400k。 想要突破 GitHub 的限制,支持單個文件超出 100M,可以使用 Git LFS

參考:突破github的100M單個大文件上傳限制

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到本地

通過本人親自實踐,有幾點說的:

  1. 像這步命令echo "參考論" >> .git/info/sparse-checkouth會在.git/info/目錄下生成sparse-checkout無後綴文件,打開看到內容可以看到設置爲了參考論,即會下載匹配參考論的目錄下所有文件。也可以修改爲別的,比如修改諸如爲參考論文/files/101,匹配參考論文/files/101文件或文件夾?。

  2. 通過實踐,發現其實不管如何設置下載指定的文件或文件夾,其實它都是有下載整個倉庫容量大小,正如知乎宮玖的回答 - 知乎,@依雲指出:

    你一定沒有親自去嘗試這個功能。「checkout」!=「clone/fetch」。實際上整個倉庫還是會全部拖回本地,只是檢出的時候不檢出別的目錄而已。

  3. 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 的配置:

  1. Windows 下打開 Git Bash,創建 SSH Key,按提示輸入密碼,可以不填密碼一路回車

    $ ssh-keygen -t rsa -C "註釋" 	#如:ssh-keygen -t rsa -C “[email protected]
  2. 生成另外一個賬號新的 SSH keys

    ssh-keygen -t rsa -C "註釋"	#如:ssh-keygen -t rsa -C "[email protected]"
    

    平時我們都是直接回車,默認生成 id_rsaid_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"

  3. 配置 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_*)
    
  4. 測試:

    $ 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.
    

解決方案總結爲:

  1. 生成私鑰/公鑰,密鑰文件命名避免重複
  2. 設置不同 Host 對應同一 HostName 但密鑰不同
  3. 取消 git 全局用戶名/郵箱設置,爲每個倉庫獨立設置用戶名/郵箱

如何取消 Git 全局用戶名/郵箱設置,如下:

  1. 使用 git config --list 查看當前配置

    如果你之前在設置本地倉庫和 github 連接的時候設置過 user.nameuser.email, 那麼你必須首先清楚掉該設置,因爲不清楚掉該設置,兩個賬號在提交資料的時候,驗證肯定衝突(只能設置一個全局的user.nameuser.email,而你現在有兩個賬號就對應兩個不同的)。

  2. 取消 global

    git config --global --unset user.name
    git config --global --unset user.email
    
  3. 設置每個項目 repo 的自己的 user.email

    git config  user.email "[email protected]"
    git config  user.name "suzie"
    

或者直接直接編輯電腦.gitconfig 文件(Windows 系統在C:\Users\用戶名\.gitconfig目錄),把 nameemail 都去掉,從而取消全局用戶/郵箱設置。

參考資料:

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

參考資料:github如何將已有的項目轉移到組織倉庫中去

7. 如何在GitHub上添加協議?

①進入你的“代碼倉庫”,點擊"Create new file",這時 GitHub 的新頁面上,有一個空格讓你填入文件名稱。

②在輸入框輸入文件名”LICENSE",這裏輸入框的右側會出現包含所有開源協議的列表,選擇合適的開源協議,選擇你需要的協議;

③點擊“Commit new file”,這時你添加的開源協議就在代碼倉庫的菜單中了。

參考:如何在github上添加協議

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 的消息郵件

二、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。

參考:

7. 其他網頁上面嵌入個人的GitHub倉庫?

是否想在其他網頁上面嵌入自己的 GitHub 倉庫頁面,有個 star 或 fork 按鈕,如下圖:

可以這樣寫:

<iframe src="https://ghbtns.com/github-btn.html?user=strivebo&amp;repo=websites-and-tools&amp;type=watch&amp;count=true&amp;size=large" allowtransparency="true" frameborder="0" scrolling="0" width="156px" height="30px"></iframe>
<iframe src="https://ghbtns.com/github-btn.html?user=strivebo&amp;repo=websites-and-tools&amp;type=fork&amp;count=true&amp;size=large" allowtransparency="true" frameborder="0" scrolling="0" width="156px" height="30px"></iframe>

把 user 和 repo 改成你自己的就可以了。PS:親測,GitHub 網站頁面暫不支持。

推薦資料


update:2019-02-18

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章