天天看點

git clone -depth 1之後切換遠端分支的方案

前言

随着項目代碼與分支切換的增多,快速clone具體分支代碼到本地成為了很實際的問題。git clone -b master ulr 這種深拷貝方式,動辄幾個G,十幾個G的資料。讓分支切換成為噩夢。

shallow clone      

淺克隆經常在一些大型倉庫中很有用——不用花費大量時間去clone一個完整的倉庫,僅僅checkout出來某個分支(如master)的最新N次遞交:

git clone --depth 1 https://github.com/openwrt/openwrt.git      

由于clone的内容非常少,是以速度就大大提升了。檢視git log也隻有最後一次遞交記錄而已。

問題來了

shallow clone對于快速clone代碼很有用,但是clone出來的代碼不會有遠端倉庫的tags,也不會有遠端倉庫的其他分支,如果需要切換tag或者切換分支應該怎麼辦呢?

取回tag

這個很簡單

git fetch --tags      

重新把遠端的tag fetch到本地的origin倉庫即可,然後在git tag就會看到tag了,之後再用checkout就可以了。

取回分支

這個就不是那麼好辦了,因為這個要求shallow clone必須轉換為deep clone。如果你不想删掉現在的倉庫目錄重新clone的話,需要做下面兩步:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git fetch --unshallow      

其中,第一步git config是容易被忽視的,shallow clone之後,remote.origin.fetch的值是+refs/heads/master:refs/remotes/origin/master,是以會發現怎麼fetch都沒有其他分支。