標籤:
Git 和 GitHub 的出現開啟了開源世界的另一扇大門,版本控制變得更強大(也更複雜),項目的管理變得更加容易,項目的開發也變得更容易進行多人協作。GitHub 無疑是程式員的 Facebook ,在這裡匯聚了無數世界頂級的項目以及頂級的程式員,你可以為你感興趣的項目加星(Star),可以關注任何人(Follow)以及他們的項目(Watch),而且更贊的是,你可以複製一份別人項目的副本(Fork),來進行自己的修改,如果你願意的話,你還可以向項目的原作者發起請求(Pull Request),將你做的修改合并到原項目中。這樣無論你是什麼人,來自不同的國家,擁有不同的技能,都可以對所有開源的項目作出貢獻。
儘管上面描述的開源世界如此美好,但是在大天朝,在牆內,你卻完全無法領略。因為當你訪問 GitHub 時,或者使用 git clone 興緻勃勃的下載你感興趣的項目時,巨慢的速度將徹底擊毀你的信心,最終只好放棄表示玩不起。
強大的長城技術對 GitHub 網開一面,沒有像 Google 或 Facebook 這樣直接斬盡殺絕,但是對它做了嚴格的限速,這種折磨比直接斃了更痛苦( 有網友表示,有些地區速度很快,有些地區速度很慢,也有可能是和網路電訊廠商有關 )。如所示, git clone 的下載速度從來沒有超過 10KiB/s ,這也就意味著一個 100MiB 的項目,需要近三個小時才能下完,而且由於網路的不穩定性,下載過程中偶爾會出現中斷連線的情況,由於 git clone 不支援斷點續傳,這讓幾個小時的下載時間白白浪費掉,只能重新開始。
這篇文章將介紹幾種方法來快速從 GitHub 上下載代碼。
一、git shallow clone
git clone 預設會下載項目的完整曆史版本,如果你只關心最新版的代碼,而不關心之前的曆史資訊,可以使用 git 的淺複製功能:
$ git clone --depth=1 https://github.com/bcit-ci/CodeIgniter.git
--depth=1 表示只下載最近一次的版本,使用淺複製可以大大減少下載的資料量,例如, CodeIgniter 項目完整下載有近 100MiB ,而使用淺複製只有 5MiB 多,這樣即使在惡劣的網路環境下,也可以快速的獲得代碼。如果之後又想擷取完整曆史資訊,可以使用下面的命令:
$ git fetch --unshallow
或者,如果你只是想下載最新的代碼看看,你也可以直接從 GitHub 上下載打包好的 ZIP 檔案,這比淺複製更快,因為它只包含了最新的代碼檔案,而且是經過 ZIP 壓縮的。但是很顯然,淺複製要更靈活一點。
二、GUI 工具 + 代理
如果很有幸你正在使用代理,懂得如何FQ的話,那麼訪問 GitHub 對你來說應該不在話下。下載 GitHub 上項目的最簡單的方法就是使用一款圖形化介面(GUI)的 Git 工具,這樣的工具現在比比皆是。使用 GUI 工具方便的地方在於,可以在設定中配置是否要使用代理,將你FQ所使用的代理 IP 拿過來配置上就 OK 了,或者更直接的,將代理配置為系統代理程式。
三、git + http.proxy
如果你跟我一樣,喜歡使用原生的 git 命令,喜歡在命令列下操作的那種感覺,那麼也可以在命令列下直接配置 git 使用代理,當然前提一樣是,你懂得如何FQ。
$ git config --global http.proxy http://proxyuser:[email protected]:8080$ git config --global https.proxy https://proxyuser:[email protected]:8080
使用上面的命令配置完之後,會在 ~/.gitconfig 檔案中多出幾行:
[http] proxy = http://proxyuser:[email protected]:8080[https] proxy = https://proxyuser:[email protected]:8080
你也可以使用下面的命令檢查配置是否生效:
$ git config --global --get http.proxy$ git config --global --get https.proxy
另外,如果你想取消該設定,可以:
$ git config --global --unset http.proxy$ git config --global --unset https.proxy
配置完成後,重新 clone 一遍,可以看到速度得到了極大的提升!
題外話:在命令列中如何使用代理?
要注意的是使用 git config --global 配置的代理只能供 git 程式使用,如果你希望讓命令列中的其他命令也能自動使用代理,譬如 curl 和 wget 等,可以使用下面的方法:
$ export http_proxy=http://proxyuser:[email protected]:8080$ export https_proxy=https://proxyuser:[email protected]:8080
這樣配置完成後,所有命令列中的 HTTP 和 HTTPS 請求都會自動通過代理來訪問了。如果要取消代理設定,可以:
$ unset http_proxy$ unset https_proxy
還有一點要注意的是,使用 http_proxy 和 https_proxy 只對 HTTP 和 HTTPS 請求有效,所以當你 ping www.google.com 的時候如果 ping 不通的話,也就沒什麼大驚小怪的了。
題外話:如何使用 PAC 檔案?
有時候我們會使用 git 訪問不同的 git 倉庫,譬如 GitHub,或者 [email protected], 或者你自建的 Git 伺服器,但是只想訪問 GitHub 的時候使用代理,訪問其他的倉庫不要使用代理。這時候我們似乎可以使用 PAC 來解決這個問題。 PAC (代理自動設定)正是用於瀏覽器來根據不同的 URL 自動採用不同的代理的一項技術,該檔案包含一個 FindProxyForURL Javascript 函數,用於根據 URL 來返回不同的代理。
但是遺憾的是,目前 git 似乎還不支援 PAC 檔案,但我們可以開啟 PAC 檔案找到代理的地址,然後通過上面的方法來配置或取消配置,只是有些繁瑣。 也許可以寫個指令碼來解析 PAC 檔案,並將 git 封裝下,來實現自動切換代理,有機會嘗試下。
四、其他方法
網上還提供了很多其他的方法,但是我暫未嘗試過,且記錄一下:
- ssh tunnel 或者 shadowsocks
- ss + proxychains
- 使用境外的 VPS
- powerpac
- VPN
參考
git clone 太慢怎麼辦?