前言
随着項目代碼與分支切換的增多,快速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都沒有其他分支。