一.需求描述: 現有一個git倉庫,Team A和Team B的人操做同一倉庫的不一樣目錄,Team A的dev但願Team B的dev沒有權限review屬於Team A的代碼目錄,故現須要先將這個git 庫下的子目錄進行拆分,爲後續單git庫權限獨有覆蓋作準備. 二.操做背景: Ubuntu shell(終端) 三.遷移(使用filter-branch命令) 因爲我須要遷移的子目錄包含中文名,所以須要使用filter-branch命令來實現遷移,固然,若是不包含中文的目錄也可使用git1.8版本之後的subtree來實現,該方法稍後說明。git
- 首先,clone 一份原倉庫並刪掉原來的 remote:(依次執行如下命令) (1)git clone ssh://username@xx.x.xx.xxx:29418/vendor/lenovo (2)cd lenovo (3)git remote rm origin
- 而後運行以下命令(這是重點): (1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder> -- --all 這條命令一樣會過濾全部歷史提交,只保留全部對指定子目錄有影響的提交,並將該子目錄設爲該倉庫的根目錄。這裏說明各下個參數的做用: --tag-name-filter 該參數控制咱們要如何處理舊的 tag,cat 即表示原樣輸出; --prune-empty 刪除空的(對子目錄沒有影響的)提交; --subdirectory-filter 指定子目錄路徑; -- --all 該參數必須跟在 -- 後面,表示對全部分支進行操做。若是你只想保存當前分支,也能夠不添加此參數。
- 清理.git的object 當上述命令執行完畢後,就能夠看到本地的新倉庫已是原倉庫子目錄中的內容了,且保留了關於該子目錄全部的提交歷史。不過只是這樣的話新倉庫中的 .git 目錄裏仍是保存有很多無用的 object,咱們須要將其清除掉以減少新倉庫的體積(若是你用subtree 的方法的話是不須要執行這一步的)。 依次執行如下命令: (1)git reset --hard (2)git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d (3)git reflog expire --expire=now --all (4)git gc --aggressive --prune=now 舒適提示:git gc操做耗時比較久,請耐心等待.
- 將新的本地倉庫推送到遠端 cd到<new-repo> (1)添加遠端地址: git remote add origin <new-git-url> (2)推送到遠端: git push -u origin master或者git push --fore origin master
四.補充subtree方式遷移 要求拆分的目錄沒有中文名 1.首先,進入<big-repo> 所在的目錄,建立一個<name-of-new-branch>的臨時分支,運行: git subtree split -P <name-of-folder> -b <name-of-new-branch> 2. 而後,咱們建立一個新的 git 倉庫: (1)mkdir <new-repo> (2)git init 3. 接着把原倉庫中的臨時分支拉到新倉庫中: git pull </path/to/big-repo> <name-of-new-branch> 好了,完成。如今看看你的新倉庫,是否是已經包含了原子文件夾中的全部文件和你以前在原倉庫中的全部提交歷史呢?後續步驟就可參照第二章中的3,4,5步了。shell
參考連接: https://blog.csdn.net/wang252949/article/details/80003791 https://blessing.studio/splitting-a-subfolder-out-into-a-new-git-repository/less