git clone 太慢怎麼辦?

來源:互聯網
上載者:User

標籤:

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 太慢怎麼辦?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.